@@ -68,6 +68,12 @@ void configureRetryTemplate() {
6868		retryTemplate .setRetryListener (retryListener );
6969	}
7070
71+ 	@ Test 
72+ 	void  checkRetryTemplateConfiguration () {
73+ 		assertThat (retryTemplate .getRetryPolicy ()).isSameAs (retryPolicy );
74+ 		assertThat (retryTemplate .getRetryListener ()).isSameAs (retryListener );
75+ 	}
76+ 
7177	@ Test 
7278	void  retryWithImmediateSuccess () throws  Exception  {
7379		AtomicInteger  invocationCount  = new  AtomicInteger ();
@@ -99,10 +105,9 @@ void retryWithInitialFailureAndZeroRetriesRetryPolicy() {
99105				.withMessageMatching ("Retry policy for operation '.+?' exhausted; aborting execution" )
100106				.withCause (exception )
101107				.satisfies (throwable  -> assertThat (throwable .getSuppressed ()).isEmpty ())
102- 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isZero ());
108+ 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isZero ())
109+ 				.satisfies (throwable  -> inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , throwable ));
103110
104- 		// RetryListener interactions: 
105- 		inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , exception );
106111		verifyNoMoreInteractions (retryListener );
107112	}
108113
@@ -122,10 +127,9 @@ void retryWithInitialFailureAndZeroRetriesFixedBackOffPolicy() {
122127				.withMessageMatching ("Retry policy for operation '.+?' exhausted; aborting execution" )
123128				.withCause (exception )
124129				.satisfies (throwable  -> assertThat (throwable .getSuppressed ()).isEmpty ())
125- 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isZero ());
130+ 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isZero ())
131+ 				.satisfies (throwable  -> inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , throwable ));
126132
127- 		// RetryListener interactions: 
128- 		inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , exception );
129133		verifyNoMoreInteractions (retryListener );
130134	}
131135
@@ -145,10 +149,9 @@ void retryWithInitialFailureAndZeroRetriesBackOffPolicyFromBuilder() {
145149				.withMessageMatching ("Retry policy for operation '.+?' exhausted; aborting execution" )
146150				.withCause (exception )
147151				.satisfies (throwable  -> assertThat (throwable .getSuppressed ()).isEmpty ())
148- 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isZero ());
152+ 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isZero ())
153+ 				.satisfies (throwable  -> inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , throwable ));
149154
150- 		// RetryListener interactions: 
151- 		inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , exception );
152155		verifyNoMoreInteractions (retryListener );
153156	}
154157
@@ -194,18 +197,19 @@ public String getName() {
194197		assertThatExceptionOfType (RetryException .class )
195198				.isThrownBy (() -> retryTemplate .execute (retryable ))
196199				.withMessage ("Retry policy for operation 'test' exhausted; aborting execution" )
197- 				.withCause (new  CustomException ("Boom 4" ));
200+ 				.withCause (new  CustomException ("Boom 4" ))
201+ 				.satisfies (throwable  -> {
202+ 					invocationCount .set (1 );
203+ 					repeat (3 , () -> {
204+ 						inOrder .verify (retryListener ).beforeRetry (retryPolicy , retryable );
205+ 						inOrder .verify (retryListener ).onRetryFailure (retryPolicy , retryable ,
206+ 								new  CustomException ("Boom "  + invocationCount .incrementAndGet ()));
207+ 					});
208+ 					inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , throwable );
209+ 				});
198210		// 4 = 1 initial invocation + 3 retry attempts 
199211		assertThat (invocationCount ).hasValue (4 );
200212
201- 		// RetryListener interactions: 
202- 		invocationCount .set (1 );
203- 		repeat (3 , () -> {
204- 			inOrder .verify (retryListener ).beforeRetry (retryPolicy , retryable );
205- 			inOrder .verify (retryListener ).onRetryFailure (retryPolicy , retryable ,
206- 					new  CustomException ("Boom "  + invocationCount .incrementAndGet ()));
207- 		});
208- 		inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , new  CustomException ("Boom 4" ));
209213		verifyNoMoreInteractions (retryListener );
210214	}
211215
@@ -240,16 +244,17 @@ public String getName() {
240244		assertThatExceptionOfType (RetryException .class )
241245				.isThrownBy (() -> retryTemplate .execute (retryable ))
242246				.withMessage ("Retry policy for operation 'always fails' exhausted; aborting execution" )
243- 				.withCause (exception );
247+ 				.withCause (exception )
248+ 				.satisfies (throwable  -> {
249+ 					repeat (5 , () -> {
250+ 						inOrder .verify (retryListener ).beforeRetry (retryPolicy , retryable );
251+ 						inOrder .verify (retryListener ).onRetryFailure (retryPolicy , retryable , exception );
252+ 					});
253+ 					inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , throwable );
254+ 				});
244255		// 6 = 1 initial invocation + 5 retry attempts 
245256		assertThat (invocationCount ).hasValue (6 );
246257
247- 		// RetryListener interactions: 
248- 		repeat (5 , () -> {
249- 			inOrder .verify (retryListener ).beforeRetry (retryPolicy , retryable );
250- 			inOrder .verify (retryListener ).onRetryFailure (retryPolicy , retryable , exception );
251- 		});
252- 		inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , exception );
253258		verifyNoMoreInteractions (retryListener );
254259	}
255260
@@ -291,17 +296,17 @@ public String getName() {
291296						suppressed1  -> assertThat (suppressed1 ).isExactlyInstanceOf (FileNotFoundException .class ),
292297						suppressed2  -> assertThat (suppressed2 ).isExactlyInstanceOf (IOException .class )
293298				))
294- 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isEqualTo (2 ));
299+ 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isEqualTo (2 ))
300+ 				.satisfies (throwable  -> {
301+ 					repeat (2 , () -> {
302+ 						inOrder .verify (retryListener ).beforeRetry (retryPolicy , retryable );
303+ 						inOrder .verify (retryListener ).onRetryFailure (eq (retryPolicy ), eq (retryable ), any (Exception .class ));
304+ 					});
305+ 					inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , throwable );
306+ 				});
295307		// 3 = 1 initial invocation + 2 retry attempts 
296308		assertThat (invocationCount ).hasValue (3 );
297309
298- 		// RetryListener interactions: 
299- 		repeat (2 , () -> {
300- 			inOrder .verify (retryListener ).beforeRetry (retryPolicy , retryable );
301- 			inOrder .verify (retryListener ).onRetryFailure (eq (retryPolicy ), eq (retryable ), any (Exception .class ));
302- 		});
303- 		inOrder .verify (retryListener ).onRetryPolicyExhaustion (
304- 				eq (retryPolicy ), eq (retryable ), any (IllegalStateException .class ));
305310		verifyNoMoreInteractions (retryListener );
306311	}
307312
@@ -354,17 +359,17 @@ public String getName() {
354359					suppressed1  -> assertThat (suppressed1 ).isExactlyInstanceOf (IOException .class ),
355360					suppressed2  -> assertThat (suppressed2 ).isExactlyInstanceOf (IOException .class )
356361				))
357- 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isEqualTo (2 ));
362+ 				.satisfies (throwable  -> assertThat (throwable .getRetryCount ()).isEqualTo (2 ))
363+ 				.satisfies (throwable  -> {
364+ 					repeat (2 , () -> {
365+ 						inOrder .verify (retryListener ).beforeRetry (retryPolicy , retryable );
366+ 						inOrder .verify (retryListener ).onRetryFailure (eq (retryPolicy ), eq (retryable ), any (IOException .class ));
367+ 					});
368+ 					inOrder .verify (retryListener ).onRetryPolicyExhaustion (retryPolicy , retryable , throwable );
369+ 				});
358370		// 3 = 1 initial invocation + 2 retry attempts 
359371		assertThat (invocationCount ).hasValue (3 );
360372
361- 		// RetryListener interactions: 
362- 		repeat (2 , () -> {
363- 			inOrder .verify (retryListener ).beforeRetry (retryPolicy , retryable );
364- 			inOrder .verify (retryListener ).onRetryFailure (eq (retryPolicy ), eq (retryable ), any (IOException .class ));
365- 		});
366- 		inOrder .verify (retryListener ).onRetryPolicyExhaustion (
367- 				eq (retryPolicy ), eq (retryable ), any (CustomFileNotFoundException .class ));
368373		verifyNoMoreInteractions (retryListener );
369374	}
370375
0 commit comments