Как имитировать клиент отдыха в тесте интеграции загрузки Spring

В тесте интеграции с весенней загрузкой, помеченном @SpringBootTest и запущенном с @RunWith(SpringRunner.class), я могу отбрасывать реальные HTTP-вызовы на свой контроллер отдыха через @Autowired TestRestTemplate restTemplate и restTemplate.postForEntity(...)

Это отлично работает, просто в конце цепочки контроллер -> служба -> restclient у меня есть клиентский компонент отдыха, который вызывает стороннюю конечную точку отдыха с использованием RestTemplates внутри, поэтому мне нужно издеваться над этой конечной точкой. Я нашел эту библиотеку com.github.tomakehurst.wiremock.client.WireMock, которую можно использовать для этого, но мне было интересно, нет ли хорошего способа весенней загрузки, такого как, например, способ протестировать клиент отдыха с @RestClientTest, чтобы достичь этого. Я пытался издеваться над MockRestServiceServer, чтобы написать на нем expectations and responses, но он, похоже, не понял. Остальные шаблоны внутри моего клиента отдыха всегда создаются как настоящие, поэтому мой вызов сторонней конечной точки не выполняется.


person radio    schedule 05.12.2017    source источник
comment
Вы можете использовать @MockBean (см., Например, docs.spring.io/spring-boot/docs/current/reference/html/) для RestTemplate, но я думаю, что wiremock является более подходящим уровень абстракции, более устойчивый к рефакторам того, как вы называете эти конечные точки.   -  person jonrsharpe    schedule 05.12.2017
comment
@MockBean в шаблоне отдыха также не работает. Он просто не имитирует шаблоны внутри остального клиентского компонента.   -  person radio    schedule 05.12.2017
comment
Другой способ, вы можете использовать Spy для службы и имитировать только звонки на отдых. Иногда для этого в сервисе я создаю метод, например: public Client getRestClient(), который использую для будущего шпионажа.   -  person borino    schedule 05.12.2017
comment
Хорошо, возможно, это возможный способ, но мне это кажется хаком, а не готовым решением для весенней загрузки. В таком случае я бы предпочел использовать Wiremock   -  person radio    schedule 05.12.2017
comment
Просто используйте @MockBean для RestClient вместо RestTemplate ?!   -  person Tom Van Rossom    schedule 06.12.2017


Ответы (1)


Вы можете вставить макет в @Before, используя ReflectionTestUtils

@Inject
private Service service;

@Mock
private RestClient restClient;

@Before
public void setup() {
    ReflectionTestUtils.setField(service, "restClient", restClient);
}
person Tom Van Rossom    schedule 05.12.2017
comment
Спасибо, но отражение не похоже на решение без взлома. Может просто нет способа весенней загрузки, они могут это улучшить - person radio; 06.12.2017
comment
Вы также можете создать и использовать сеттер, если вам не нравится отражение. - person Tom Van Rossom; 06.12.2017
comment
Спасибо, на самом деле мне нужен хороший дизайн, а не просто возможность. Добавлять сеттер просто ради тестирования нежелательно. - person radio; 07.12.2017