Skip to content

Commit a04dd02

Browse files
committed
Prune internal frames from AssertionFailedError
When using `JUnit.start` and creating a failing test, users will be confronted with a large stacktrace with mostly irrelevant information. Even after #5158 is merged, the stacktrace will contain several internal frames: ``` org.opentest4j.AssertionFailedError: expected: <11> but was: <12> at org.junit.jupiter.api@6.1.0-SNAPSHOT/org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:158) at org.junit.jupiter.api@6.1.0-SNAPSHOT/org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:139) at org.junit.jupiter.api@6.1.0-SNAPSHOT/org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:201) at org.junit.jupiter.api@6.1.0-SNAPSHOT/org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:152) at org.junit.jupiter.api@6.1.0-SNAPSHOT/org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:147) at org.junit.jupiter.api@6.1.0-SNAPSHOT/org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:558) at com.examp.project/com.example.project.HelloTest.stringLength(HelloTest.java:14) ``` By pruning these internal frames, the stacktrace can be reduced to a much more readable: ``` org.opentest4j.AssertionFailedError: expected: <11> but was: <12> at com.examp.project/com.example.project.HelloTest.stringLength(HelloTest.java:14) ``` Comparable behaviour can be found in AssertJ[1] and IDEA which folds internal frames in the console using `<6 internal line>`. The pruning functionality is intentionally added to the `AssertionFailureBuilder` rather than the `ExceptionUtils` to enable other users to also prune the internal frames from their own assertions. 1. https://github.com/assertj/assertj/blob/79bdebf1817692e5e0ff5ee3ab097dcd104d47ae/assertj-core/src/main/java/org/assertj/core/util/Throwables.java#L117-L148
1 parent 49ba3f2 commit a04dd02

20 files changed

+92
-7
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ private static AssertionFailedError expectedArrayIsNullFailure(@Nullable Deque<I
483483
return assertionFailure() //
484484
.message(messageOrSupplier) //
485485
.reason("expected array was <null>" + formatIndexes(indexes)) //
486+
.pruneStackTrace(Assertions.class) //
486487
.build();
487488
}
488489

@@ -495,6 +496,7 @@ private static AssertionFailedError actualArrayIsNullFailure(@Nullable Deque<Int
495496
return assertionFailure() //
496497
.message(messageOrSupplier) //
497498
.reason("actual array was <null>" + formatIndexes(indexes)) //
499+
.pruneStackTrace(Assertions.class) //
498500
.build();
499501
}
500502

@@ -507,6 +509,7 @@ private static void assertArraysHaveSameLength(int expected, int actual, @Nullab
507509
.reason("array lengths differ" + formatIndexes(indexes)) //
508510
.expected(expected) //
509511
.actual(actual) //
512+
.pruneStackTrace(Assertions.class) //
510513
.buildAndThrow();
511514
}
512515
}
@@ -519,6 +522,7 @@ private static void failArraysNotEqual(@Nullable Object expected, @Nullable Obje
519522
.reason("array contents differ" + formatIndexes(indexes)) //
520523
.expected(expected) //
521524
.actual(actual) //
525+
.pruneStackTrace(Assertions.class) //
522526
.buildAndThrow();
523527
}
524528

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public static AssertionFailedError createAssertionFailedError(@Nullable Object m
8787
.message(messageOrSupplier) //
8888
.reason("Unexpected exception thrown: " + t.getClass().getName() + buildSuffix(t.getMessage())) //
8989
.cause(t) //
90+
.pruneStackTrace(Assertions.class) //
9091
.build();
9192
}
9293

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ private static void failNotEqual(@Nullable Object expected, @Nullable Object act
198198
.message(messageOrSupplier) //
199199
.expected(expected) //
200200
.actual(actual) //
201+
.pruneStackTrace(Assertions.class) //
201202
.buildAndThrow();
202203
}
203204
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ private static void failNotFalse(@Nullable Object messageOrSupplier) {
6666
.message(messageOrSupplier) //
6767
.expected(false) //
6868
.actual(true) //
69+
.pruneStackTrace(Assertions.class) //
6970
.buildAndThrow();
7071
}
7172

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
@@ -56,6 +56,7 @@ private static <T> T assertInstanceOf(Class<T> expectedType, @Nullable Object ac
5656
.expected(expectedType) //
5757
.actual(actualValue == null ? null : actualValue.getClass()) //
5858
.cause(actualValue instanceof Throwable t ? t : null) //
59+
.pruneStackTrace(Assertions.class) //
5960
.buildAndThrow();
6061
}
6162
return expectedType.cast(actualValue);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ private static AssertionFailedError expectedIterableIsNullFailure(Deque<Integer>
153153
return assertionFailure() //
154154
.message(messageOrSupplier) //
155155
.reason("expected iterable was <null>" + formatIndexes(indexes)) //
156+
.pruneStackTrace(Assertions.class) //
156157
.build();
157158
}
158159

@@ -165,6 +166,7 @@ private static AssertionFailedError actualIterableIsNullFailure(Deque<Integer> i
165166
return assertionFailure() //
166167
.message(messageOrSupplier) //
167168
.reason("actual iterable was <null>" + formatIndexes(indexes)) //
169+
.pruneStackTrace(Assertions.class) //
168170
.build();
169171
}
170172

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ void fail(String format, Object... args) {
193193
.expected(join(newLine, expectedLines)) //
194194
.actual(join(newLine, actualLines)) //
195195
.includeValuesInMessage(false) //
196+
.pruneStackTrace(Assertions.class) //
196197
.buildAndThrow();
197198
}
198199
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ private static void failEqual(@Nullable Object actual, @Nullable Object messageO
279279
assertionFailure() //
280280
.message(messageOrSupplier) //
281281
.reason("expected: not equal but was: <" + actual + ">") //
282+
.pruneStackTrace(Assertions.class) //
282283
.buildAndThrow();
283284
}
284285

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ private static void failNull(@Nullable Object messageOrSupplier) {
5252
assertionFailure() //
5353
.message(messageOrSupplier) //
5454
.reason("expected: not <null>") //
55+
.pruneStackTrace(Assertions.class) //
5556
.buildAndThrow();
5657
}
5758
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ private static void failSame(@Nullable Object actual, @Nullable Object messageOr
4949
assertionFailure() //
5050
.message(messageOrSupplier) //
5151
.reason("expected: not same but was: <" + actual + ">") //
52+
.pruneStackTrace(Assertions.class) //
5253
.buildAndThrow();
5354
}
5455

0 commit comments

Comments
 (0)