6

При работе с Spring Boot для создания микросервисов очень легко написать обширные и очень читаемые интеграционные тесты и mock-запросы удаленного обслуживания с MockRestServiceServer.Весенняя обувь + облако | Zuul Proxy | Интеграционное тестирование

Есть ли способ использовать аналогичный подход для проведения дополнительного теста интеграции на ZuulProxy? То, что я хотел бы достигнуть, - это возможность высмеять удаленные серверы, которые ZuulProxy пересылали и проверяли, что все мои ZuulFitler s ведут себя как и ожидалось. Тем не менее, ZuulProxy использует RestClient из Netflix (устарел, казалось бы?), Который, естественно, не использует RestTemplate, который может быть повторно настроен на MockRestServiceServer, и в настоящее время я не могу найти хороший способ издеваться над ответами удаленных служб на прокси-запросы.

У меня есть микросервис, который отвечает за обработку создания ключа сеанса API, а затем будет действовать аналогично шлюзу API. Пересылка осуществляется с помощью Zuul Proxy для лежащих в основе служб, а Zuul Filters обнаруживает, что ключ сеанса действителен или нет. Таким образом, интеграционный тест создаст действительный сеанс, а затем перейдет на поддельную конечную точку, например, «интеграция/тест».

Задать вопрос о том, что «интеграция/тест» является новой конечной точкой, установив свойство конфигурации на @WebIntegrationTest, я могу успешно имитировать все службы, которые обрабатываются через RestTemplate, но не пересылку Zuul.

Каков наилучший способ добиться издевательств в прямом целевом сервисе?

ответ

3

Отъезд WireMock. Я использую его для тестирования уровня интеграции моего проекта Spring Cloud Zuul.

import static com.github.tomakehurst.wiremock.client.WireMock.*; 

public class TestClass { 
@Rule 
public WireMockRule serviceA = new WireMockRule(WireMockConfiguration.options().dynamicPort()); 

@Before 
public void before() { 
    serviceA.stubFor(get(urlPathEqualTo("/test-path/test")).willReturn(aResponse() 
      .withHeader("Content-Type", "application/json").withStatus(200).withBody("serviceA:test-path"))); 
} 

@Test 
public void testRoute() { 
    ResponseEntity<String> responseEntity = this.restTemplate.getForEntity("/test-path/test", String.class); 
    assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); 

    serviceA.verify(1, getRequestedFor(urlPathEqualTo("/test-path/test"))); 
} 
} 
+1

есть ли какая-либо конфигурация, которая должна быть добавлена ​​для этого? Я пытаюсь сделать что-то подобное, но Зуул не выбирает маршрут. Я получаю это исключение 'Caused by: com.netflix.client.ClientException: балансировка нагрузки не имеет доступного сервера для клиента: strategie'. Я предполагаю, что это происходит из конфигурации Zuul, ожидающей получения информации от сервера обнаружения сервисов, в данном случае Eureka, для маршрутизации вызова на правильный ip. – Kilian

Смежные вопросы