@@ -79,6 +79,23 @@ public String toString() {
7979 }
8080 }
8181
82+ /**
83+ * Test exception whose {@link #toString()} is intentionally overridden to return a fixed value.
84+ */
85+ private static final class ToStringOverridingException extends RuntimeException {
86+
87+ private static final ToStringOverridingException INSTANCE = new ToStringOverridingException ();
88+
89+ private ToStringOverridingException () {
90+ super (EXCEPTION );
91+ }
92+
93+ @ Override
94+ public String toString () {
95+ return "foo" ;
96+ }
97+ }
98+
8299 static Stream <SeparatorTestCase > separatorTestCases () {
83100 final String level = LEVEL .toString ();
84101 return Stream .of (
@@ -214,6 +231,14 @@ void full_output_should_match_Throwable_printStackTrace(final String pattern) {
214231 assertThat (actualStackTrace ).as ("pattern=`%s`" , effectivePattern ).isEqualTo (expectedStackTrace );
215232 }
216233
234+ @ Test
235+ void full_output_should_use_custom_toString () {
236+ final Throwable exception = ToStringOverridingException .INSTANCE ;
237+ final String expectedStackTrace = renderStackTraceUsingJava (exception );
238+ final String actualStackTrace = convert (patternPrefix , exception );
239+ assertThat (actualStackTrace ).isEqualTo (expectedStackTrace );
240+ }
241+
217242 // This test does not provide `separator` and `suffix` options, since the reference output will be obtained from
218243 // `Throwable#printStackTrace()`, which doesn't take these into account.
219244 @ ParameterizedTest
@@ -252,10 +277,14 @@ private String limitLines(final String text, final int maxLineCount) {
252277 }
253278
254279 private String renderStackTraceUsingJava () {
280+ return renderStackTraceUsingJava (EXCEPTION );
281+ }
282+
283+ private String renderStackTraceUsingJava (final Throwable throwable ) {
255284 final Charset charset = StandardCharsets .UTF_8 ;
256285 try (final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
257286 final PrintStream printStream = new PrintStream (outputStream , false , charset .name ())) {
258- EXCEPTION .printStackTrace (printStream );
287+ throwable .printStackTrace (printStream );
259288 printStream .flush ();
260289 return new String (outputStream .toByteArray (), charset );
261290 } catch (final Exception error ) {
@@ -545,9 +574,13 @@ private static List<Exception> createExceptionsOfDifferentDepths() {
545574 }
546575
547576 static String convert (final String pattern ) {
577+ return convert (pattern , EXCEPTION );
578+ }
579+
580+ private static String convert (final String pattern , final Throwable throwable ) {
548581 final List <PatternFormatter > patternFormatters = PATTERN_PARSER .parse (pattern , false , true , true );
549582 final LogEvent logEvent =
550- Log4jLogEvent .newBuilder ().setThrown (EXCEPTION ).setLevel (LEVEL ).build ();
583+ Log4jLogEvent .newBuilder ().setThrown (throwable ).setLevel (LEVEL ).build ();
551584 final StringBuilder buffer = new StringBuilder ();
552585 for (final PatternFormatter patternFormatter : patternFormatters ) {
553586 patternFormatter .format (logEvent , buffer );
0 commit comments