Поскольку andres и pvpkiran упомянуто / объяснено, мне пришлось добавить интеграционный тест.
Вы можете добиться этого, просто добавив @ SpringBootTest аннотация к вашему тестовому классу, он будет bootstrap контейнером с пружинным контекстом.
Я также автоматически подключил CircuitBreakerRegistry для сброса автоматического выключателя перед каждым тестом, чтобы я мог гарантировать чистый тест. Для насмешек / шпионажа / проверки я использовал Mockito из весеннего загрузочного тестового стартера (spring-boot-starter-test).
Вот как мне удалось протестировать методы восстановления:
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = Application.class)
public class RestClientIntegrationTest {
private final String SEARCH_VALUE = "1234567890";
@MockBean( name = "myRealRestTemplateName")
private RestTemplate restTemplate;
@SpyBean
private MyRestClient client;
@Autowired
private CircuitBreakerRegistry circuitBreakerRegistry;
@BeforeEach
public void setUp() {
circuitBreakerRegistry.circuitBreaker("MY_CIRCUIT_BREAKER_NAME").reset();
}
@Test
public void should_search_and_fallback_when_ResourceAccessException_is_thrown() {
// prepare
when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(String.class), eq(SEARCH_VALUE)))
.thenThrow(ResourceAccessException.class);
String expectedResult = "expected result when fallback is called";
// action
String actualResult = client.search(SEARCH_VALUE);
// assertion
verify(client).fallback(eq(SEARCH_VALUE), any(ResourceAccessException.class));
assertThat(actualResult, is(expectedResult));
}
}
Я надеюсь, что нет ошибки компиляции, так как мне пришлось удалить некоторые несущественные вещи.