Spring / Spring Retry Interview Questions
How do you write a unit test for a @Retryable method?
Testing a @Retryable method requires a Spring context because retry logic is applied by the AOP proxy. A plain unit test that calls the method on a new instance will not trigger retries. The recommended approach uses @SpringBootTest or a focused @SpringJUnitConfig with @EnableRetry.
Test setup:
@SpringBootTest class OrderServiceRetryTest { @Autowired private OrderService orderService; @MockBean private ExternalApi externalApi; @Test void shouldRetryThreeTimesOnFailure() { when(externalApi.fetch()).thenThrow(new RuntimeException("down")); assertThrows(RuntimeException.class, () -> orderService.getOrder()); verify(externalApi, times(3)).fetch(); // maxAttempts = 3 } @Test void shouldSucceedOnSecondAttempt() { when(externalApi.fetch()) .thenThrow(new RuntimeException()) .thenReturn("OK"); String result = orderService.getOrder(); assertEquals("OK", result); verify(externalApi, times(2)).fetch(); } }
To avoid slow tests due to backoff delays during testing, override the backoff with a zero delay in a test profile:
@Retryable(backoff = @Backoff(delayExpression = "${retry.delay:0}"))
Setting retry.delay=0 in application-test.properties eliminates wait time during test runs.
More Related questions...