@@ -106,4 +106,43 @@ void givenExceptionCauseHasAnotherTypeCauseThenGetItsDescendantsCause() {
106106 assertThat (actualCause ).isNotNull ().hasMessage ("error" );
107107 }
108108 }
109+
110+ @ Nested
111+ @ DisplayName ("test getActualMessage(Throwable throwable)" )
112+ class WhenGetActualMessage {
113+ @ Test
114+ @ DisplayName ("when throwable has non-blank message, return the message" )
115+ void givenThrowableWithMessageThenReturnMessage () {
116+ Throwable throwable = new Exception ("Error occurred" );
117+ String message = ExceptionUtils .getActualMessage (throwable );
118+ assertThat (message ).isEqualTo ("Error occurred" );
119+ }
120+
121+ @ Test
122+ @ DisplayName ("when throwable chain has non-blank message in deep cause, return the first valid message" )
123+ void givenDeepThrowableChainThenReturnFirstValidMessage () {
124+ Throwable cause = new Exception ("Root cause" );
125+ Throwable throwable = new Exception (null , new Exception (" " , cause ));
126+ String message = ExceptionUtils .getActualMessage (throwable );
127+ assertThat (message ).isEqualTo ("Root cause" );
128+ }
129+
130+ @ Test
131+ @ DisplayName ("when throwable chain has all blank messages, return null" )
132+ void givenAllBlankMessagesThenReturnNull () {
133+ Throwable throwable = new Exception (null , new Exception (" " ));
134+ String message = ExceptionUtils .getActualMessage (throwable );
135+ assertThat (message ).isNull ();
136+ }
137+
138+ @ Test
139+ @ DisplayName ("when throwable chain has circular reference, return valid message" )
140+ void givenCircularReferenceThenReturnFirstValidMessage () {
141+ Exception e1 = new Exception ("e1" );
142+ Exception e2 = new Exception ("e2" , e1 );
143+ e1 .initCause (e2 );
144+ assertThat (ExceptionUtils .getActualMessage (e1 )).isEqualTo ("e1" );
145+ assertThat (ExceptionUtils .getActualMessage (e2 )).isEqualTo ("e2" );
146+ }
147+ }
109148}
0 commit comments