6

Podczas pracy z Spring Boot w celu stworzenia mikro-usług bardzo łatwo napisać obszerne i bardzo czytelne testy integracyjne i fałszywe zdalne żądania serwisowe z MockRestServiceServer.Spring Boot + Cloud | Zuul Proxy | Testowanie integracyjne

Czy istnieje sposób zastosowania podobnego podejścia do przeprowadzenia dodatkowego testu integracji pod numerem ZuulProxy? To, co chciałbym osiągnąć, to móc sfałszować serwery zdalne, które będą przesyłać do ZuulProxy i potwierdzić, że wszystkie moje zbiory zachowywały się zgodnie z oczekiwaniami. Jednakże, ZuulProxy używa RestClient z Netflix (wydaje się, że jest to przestarzałe?), Które naturalnie nie używa RestTemplate, które może być ponownie skonfigurowane przez MockRestServiceServer i obecnie nie mogę znaleźć dobrego sposobu na wyśmiewanie odpowiedzi ze zdalnych usług dla żądań pośredniczących.

Mam mikro-usługę, która jest odpowiedzialna za tworzenie klucza sesji API, a następnie działa podobnie do bramy API. Przekazywanie odbywa się za pomocą Zuul Proxy do bazowych usług, a filtry Zuul wykryją, czy klucz sesji jest ważny, czy nie. Test integracyjny utworzyłby zatem prawidłową sesję, a następnie przekazał do fałszywego punktu końcowego, np. "Integracja/test".

Określenie, że "integracja/test" jest nowym punktem końcowym, możliwe jest poprzez ustawienie właściwości konfiguracji na @WebIntegrationTest, mogę z powodzeniem kpić z wszystkich usług, które są obsługiwane przez RestTemplate, ale nie mogę przekazywać Zuul.

Jaki jest najlepszy sposób na osiągnięcie kpiny z usługi docelowej?

Odpowiedz

3

Zapoznaj się z WireMock. Używam go do testowania poziomu integracji mojego projektu 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

Czy istnieje konfiguracja, która musi zostać dodana, aby to działało? Próbuję zrobić coś podobnego, ale Zuul nie wybiera trasy. Otrzymuję ten wyjątek 'Powodowany przez: com.netflix.client.ClientException: Load Balancer nie ma dostępnego serwera dla klienta: strategie'. Wyobrażam sobie, że pochodzi to z konfiguracji Zuul, oczekującej informacji od serwera wykrywania usług, w tym przypadku Eureka, do kierowania połączenia do właściwego IP. – Kilian

Powiązane problemy