@@ -24,41 +24,43 @@ private StackTraces() {
24
24
* @return a trimmed stack trace, or the original trace if trimming wasn't possible
25
25
*/
26
26
public static String getTrimmedStackTrace (Throwable exception ) {
27
- StringWriter stringWriter = new StringWriter ();
28
- PrintWriter writer = new PrintWriter (stringWriter );
29
- exception .printStackTrace (writer );
30
- return trimStackTrace (exception .toString (), stringWriter .toString ());
31
- }
32
-
33
- static String trimStackTrace (String extractedExceptionMessage , String fullTrace ) {
34
- StringBuilder trimmedTrace = new StringBuilder (extractedExceptionMessage );
27
+ String fullTrace = getFullStackTrace (exception );
35
28
BufferedReader reader = new BufferedReader (
36
- new StringReader (fullTrace .substring (extractedExceptionMessage .length ())));
29
+ new StringReader (fullTrace .substring (exception . toString () .length ())));
37
30
38
31
try {
39
32
// Collect the stack trace lines for "exception" (but not the cause).
40
33
List <String > stackTraceLines = new ArrayList <String >();
41
- List <String > remainingLines = new ArrayList <String >();
42
- collectStackTraceLines (reader , stackTraceLines , remainingLines );
34
+ List <String > causedByLines = new ArrayList <String >();
35
+ collectStackTraceLines (reader , stackTraceLines , causedByLines );
43
36
44
37
if (stackTraceLines .isEmpty ()) {
45
38
// No stack trace?
46
39
return fullTrace ;
47
40
}
48
- boolean hasCause = !remainingLines .isEmpty ();
41
+ boolean hasCause = !causedByLines .isEmpty ();
49
42
stackTraceLines = trimStackTraceLines (stackTraceLines , hasCause );
50
43
if (stackTraceLines .isEmpty ()) {
51
44
// Could not trim stack trace lines.
52
45
return fullTrace ;
53
46
}
47
+
48
+ StringBuilder trimmedTrace = new StringBuilder (exception .toString ());
54
49
appendStackTraceLines (stackTraceLines , trimmedTrace );
55
- appendStackTraceLines (remainingLines , trimmedTrace );
50
+ appendStackTraceLines (causedByLines , trimmedTrace );
56
51
return trimmedTrace .toString ();
57
52
} catch (IOException e ) {
58
53
}
59
54
return fullTrace ;
60
55
}
61
56
57
+ private static String getFullStackTrace (Throwable exception ) {
58
+ StringWriter stringWriter = new StringWriter ();
59
+ PrintWriter writer = new PrintWriter (stringWriter );
60
+ exception .printStackTrace (writer );
61
+ return stringWriter .toString ();
62
+ }
63
+
62
64
private static void collectStackTraceLines (
63
65
BufferedReader reader ,
64
66
List <String > stackTraceLines ,
@@ -94,8 +96,9 @@ private static List<String> trimStackTraceLines(
94
96
if (!hasCause ) {
95
97
return trimmedLines ;
96
98
}
97
- List <String > copy = new ArrayList <String >(trimmedLines );
98
- copy .add ("\t ..." + (stackTraceLines .size () - copy .size ()) + "more" );
99
+ List <String > copy = new ArrayList <String >(trimmedLines .size () + 1 );
100
+ copy .addAll (trimmedLines );
101
+ copy .add ("\t ... " + (stackTraceLines .size () - trimmedLines .size ()) + " trimmed" );
99
102
return copy ;
100
103
}
101
104
linesToInclude --;
@@ -166,28 +169,35 @@ private enum State {
166
169
"junit." ,
167
170
};
168
171
172
+ private static final String [] TEST_FRAMEWORK_TEST_METHOD_NAME_PREFIXES = {
173
+ "org.junit.internal.StackTracesTest" ,
174
+ };
175
+
169
176
private static boolean isTestFrameworkStackTraceLine (String line ) {
170
- return isMatchingStackTraceLine (line , TEST_FRAMEWORK_METHOD_NAME_PREFIXES );
177
+ return isMatchingStackTraceLine (line , TEST_FRAMEWORK_METHOD_NAME_PREFIXES ) &&
178
+ !isMatchingStackTraceLine (line , TEST_FRAMEWORK_TEST_METHOD_NAME_PREFIXES );
171
179
}
172
180
173
181
private static final String [] REFLECTION_METHOD_NAME_PREFIXES = {
174
182
"sun.reflect." ,
175
183
"java.lang.reflect." ,
176
- "org.junit.rules.RunRules.evaluate(" , // get better stack traces for failures in method rules
184
+ "org.junit.rules.RunRules.<init>(" ,
185
+ "org.junit.rules.RunRules.applyAll(" , // calls TestRules
186
+ "org.junit.runners.BlockJUnit4ClassRunner.withMethodRules(" , // calls MethodRules
177
187
"junit.framework.TestCase.runBare(" , // runBare() directly calls setUp() and tearDown()
178
188
};
179
189
180
190
private static boolean isReflectionStackTraceLine (String line ) {
181
191
return isMatchingStackTraceLine (line , REFLECTION_METHOD_NAME_PREFIXES );
182
192
}
183
193
184
- private static boolean isMatchingStackTraceLine (String line , String [] packagePrefixes ) {
194
+ private static boolean isMatchingStackTraceLine (String line , String [] methodNamePrefixes ) {
185
195
if (!line .startsWith ("\t at " )) {
186
196
return false ;
187
197
}
188
198
line = line .substring (4 );
189
- for (String packagePrefix : packagePrefixes ) {
190
- if (line .startsWith (packagePrefix )) {
199
+ for (String methodNamePrefix : methodNamePrefixes ) {
200
+ if (line .startsWith (methodNamePrefix )) {
191
201
return true ;
192
202
}
193
203
}
0 commit comments