Skip to content

Commit c9488c1

Browse files
authored
Enrich assertInstanceOf failure with cause
This results in the stack trace of the test subject `Throwable` being reported along with the failure.
1 parent 40c3b0a commit c9488c1

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

documentation/src/docs/asciidoc/release-notes/release-notes-6.1.0-M1.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ repository on GitHub.
5252
* Introduce new `dynamicContainer(Consumer<? super Configuration>)` factory method for
5353
dynamic containers. It allows configuring the `ExecutionMode` of the dynamic container
5454
and/or its children in addition to its display name, test source URI, and children.
55-
55+
* Enrich `assertInstanceOf` failure using the test subject `Throwable` as cause. It
56+
results in the stack trace of the test subject `Throwable` to get reported along with
57+
the failure.
5658

5759
[[release-notes-6.1.0-M1-junit-vintage]]
5860
=== JUnit Vintage

junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertInstanceOf.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ private static <T> T assertInstanceOf(Class<T> expectedType, @Nullable Object ac
5555
.reason(actualValue == null ? "Unexpected null value" : "Unexpected type") //
5656
.expected(expectedType) //
5757
.actual(actualValue == null ? null : actualValue.getClass()) //
58+
.cause(actualValue instanceof Throwable t ? t : null) //
5859
.buildAndThrow();
5960
}
6061
return expectedType.cast(actualValue);

jupiter-tests/src/test/java/org/junit/jupiter/api/AssertInstanceOfAssertionsTests.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,19 @@ private void assertInstanceOfFails(Class<?> expectedType, @Nullable Object actua
9696
String valueType = actualValue == null ? "null" : actualValue.getClass().getCanonicalName();
9797
String expectedMessage = "Unexpected %s, expected: <%s> but was: <%s>".formatted(unexpectedSort,
9898
expectedType.getCanonicalName(), valueType);
99+
Throwable expectedCause = actualValue instanceof Throwable throwable ? throwable : null;
99100

100-
assertThrowsWithMessage(expectedMessage, () -> assertInstanceOf(expectedType, actualValue));
101-
assertThrowsWithMessage("extra ==> " + expectedMessage,
101+
assertThrowsWithMessage(expectedMessage, expectedCause, () -> assertInstanceOf(expectedType, actualValue));
102+
assertThrowsWithMessage("extra ==> " + expectedMessage, expectedCause,
102103
() -> assertInstanceOf(expectedType, actualValue, "extra"));
103-
assertThrowsWithMessage("extra ==> " + expectedMessage,
104+
assertThrowsWithMessage("extra ==> " + expectedMessage, expectedCause,
104105
() -> assertInstanceOf(expectedType, actualValue, () -> "extra"));
105106
}
106107

107-
private void assertThrowsWithMessage(String expectedMessage, Executable executable) {
108-
assertEquals(expectedMessage, assertThrows(AssertionFailedError.class, executable).getMessage());
108+
private void assertThrowsWithMessage(String expectedMessage, @Nullable Throwable expectedCause,
109+
Executable executable) {
110+
Throwable throwable = assertThrows(AssertionFailedError.class, executable);
111+
assertEquals(expectedMessage, throwable.getMessage());
112+
assertSame(expectedCause, throwable.getCause());
109113
}
110114
}

0 commit comments

Comments
 (0)