@@ -69,6 +69,23 @@ public String toString() {
6969 }
7070 }
7171
72+ /**
73+ * Test exception whose {@link #toString()} is intentionally overridden to return a fixed value.
74+ */
75+ private static final class ToStringOverridingException extends RuntimeException {
76+
77+ private static final ToStringOverridingException INSTANCE = new ToStringOverridingException ();
78+
79+ private ToStringOverridingException () {
80+ super (EXCEPTION );
81+ }
82+
83+ @ Override
84+ public String toString () {
85+ return "foo" ;
86+ }
87+ }
88+
7289 static Stream <SeparatorTestCase > separatorTestCases () {
7390 final String level = LEVEL .toString ();
7491 return Stream .of (
@@ -204,6 +221,14 @@ void full_output_should_match_Throwable_printStackTrace(final String pattern) {
204221 assertThat (actualStackTrace ).as ("pattern=`%s`" , effectivePattern ).isEqualTo (expectedStackTrace );
205222 }
206223
224+ @ Test
225+ void full_output_should_use_custom_toString () {
226+ final Throwable exception = ToStringOverridingException .INSTANCE ;
227+ final String expectedStackTrace = renderStackTraceUsingJava (exception );
228+ final String actualStackTrace = convert (patternPrefix , exception );
229+ assertThat (actualStackTrace ).isEqualTo (expectedStackTrace );
230+ }
231+
207232 // This test does not provide `separator` and `suffix` options, since the reference output will be obtained from
208233 // `Throwable#printStackTrace()`, which doesn't take these into account.
209234 @ ParameterizedTest
@@ -242,10 +267,14 @@ private String limitLines(final String text, final int maxLineCount) {
242267 }
243268
244269 private String renderStackTraceUsingJava () {
270+ return renderStackTraceUsingJava (EXCEPTION );
271+ }
272+
273+ private String renderStackTraceUsingJava (final Throwable throwable ) {
245274 final Charset charset = StandardCharsets .UTF_8 ;
246275 try (final ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
247276 final PrintStream printStream = new PrintStream (outputStream , false , charset .name ())) {
248- EXCEPTION .printStackTrace (printStream );
277+ throwable .printStackTrace (printStream );
249278 printStream .flush ();
250279 return new String (outputStream .toByteArray (), charset );
251280 } catch (final Exception error ) {
@@ -438,9 +467,13 @@ private static String normalizeStackTrace(final String stackTrace, final String
438467 }
439468
440469 static String convert (final String pattern ) {
470+ return convert (pattern , EXCEPTION );
471+ }
472+
473+ private static String convert (final String pattern , final Throwable throwable ) {
441474 final List <PatternFormatter > patternFormatters = PATTERN_PARSER .parse (pattern , false , true , true );
442475 final LogEvent logEvent =
443- Log4jLogEvent .newBuilder ().setThrown (EXCEPTION ).setLevel (LEVEL ).build ();
476+ Log4jLogEvent .newBuilder ().setThrown (throwable ).setLevel (LEVEL ).build ();
444477 final StringBuilder buffer = new StringBuilder ();
445478 for (final PatternFormatter patternFormatter : patternFormatters ) {
446479 patternFormatter .format (logEvent , buffer );
0 commit comments