Я использую Spring-Cloud-Netflix для связи между микросервисами. Предположим, у меня есть две службы - Foo и Bar, а Foo потребляет одну из конечных точек REST Bar. Я использую интерфейс с аннотацией @FeignClient
:Как написать интеграционные тесты с spring-cloud-netflix и feign
@FeignClient
public interface BarClient {
@RequestMapping(value = "/some/url", method = "POST")
void bazzle(@RequestBody BazzleRequest);
}
Тогда у меня есть класс обслуживания SomeService
в Foo, который вызывает BarClient
.
@Component
public class SomeService {
@Autowired
BarClient barClient;
public String doSomething() {
try {
barClient.bazzle(new BazzleRequest(...));
return "so bazzle my eyes dazzle";
} catch(FeignException e) {
return "Not bazzle today!";
}
}
}
Теперь, чтобы убедиться, что связь между службами работ, я хочу построить тест, который стреляет реальный запрос HTTP против ложного сервера Bar, используя что-то вроде WireMock. Тест должен убедиться, что feign правильно декодирует ответ службы и сообщает об этом SomeService
.
public class SomeServiceIntegrationTest {
@Autowired SomeService someService;
@Test
public void shouldSucceed() {
stubFor(get(urlEqualTo("/some/url"))
.willReturn(aResponse()
.withStatus(204);
String result = someService.doSomething();
assertThat(result, is("so bazzle my eyes dazzle"));
}
@Test
public void shouldFail() {
stubFor(get(urlEqualTo("/some/url"))
.willReturn(aResponse()
.withStatus(404);
String result = someService.doSomething();
assertThat(result, is("Not bazzle today!"));
}
}
Как я могу вводить такой сервер WireMock в эврика, так что симулировать способен найти и общаться с ним? Какая магия аннотаций мне нужна?
Я попытался предложить вам ответ, но я понимаю, что, скорее всего, ваша цель не очень хорошая. Если вы говорите об интеграционных тестах, вам не нужно издеваться над логикой «BarClient». если вы это сделаете, тогда ваш тест будет Unit Test, а не интеграцией. И если это модульный тест, вы можете издеваться над «BarClient» простым с Mokito, без HTTP-запросов вообще. Я не понимаю, зачем вам нужен HTTP-запрос? –
Я не хочу строить интеграционные тесты, которые объединяют несколько микросервисов. Когда я говорю об интеграционном тесте, я имею в виду тестирование интеграции всех технических уровней в «FooService», в отличие от единичных тестов, которые проверяют только один класс, и заменяют остальных на mocks или stub. –
Вы просмотрели [RestClientTest] (http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured- rest-client), а это «MockRestServiceServer» в Spring Boot 1.4? – Tim