6

Quando si lavora con Spring Boot per creare micro-servizi è molto facile scrivere test di integrazione estesi e molto leggibili e richieste di assistenza remota fittizie con MockRestServiceServer.Spring Boot + Cloud | Zuul Proxy | Test di integrazione

Esiste un modo per utilizzare un approccio simile per eseguire test di integrazione aggiuntivi su ZuulProxy? Quello che mi piacerebbe ottenere è riuscire a prendere in giro server remoti che ZuulProxy inoltrerebbe ae convalidare che tutti i miei ZuulFitler si sono comportati come previsto. Tuttavia, ZuulProxy utilizza RestClient da Netflix (sembrerebbe deprecato?) Che naturalmente non utilizza RestTemplate che potrebbe essere riconfigurato da MockRestServiceServer e al momento non riesco a trovare un buon modo di prendere in giro le risposte dai servizi remoti per le richieste proxy.

Ho un micro-servizio che è responsabile della gestione della creazione della chiave di sessione API e quindi agirà in modo simile a un gateway API. L'inoltro viene eseguito con Zuul Proxy ai servizi esposti sottostanti e Zuul Filters rileva se la chiave di sessione è valida o meno. Un test di integrazione creerebbe quindi una sessione valida e quindi inoltrerà a un finto endpoint, ad esempio "integrazione/test".

specificando che 'integrazione/test' è un nuovo punto finale è possibile impostando una proprietà di configurazione su @WebIntegrationTest, posso prendere in giro con successo tutti i servizi che vengono gestiti tramite RestTemplate ma non l'inoltro Zuul.

Qual è il modo migliore per ottenere il beffardo di un servizio di destinazione in avanti?

risposta

3

Check out WireMock. L'ho usato per eseguire test di livello di integrazione del mio progetto 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

c'è qualche configurazione che deve essere aggiunta affinché funzioni? Sto cercando di fare qualcosa di simile ma Zuul non sceglie la via. Ottengo questa eccezione 'Causato da: com.netflix.client.ClientException: Load Balancer non ha server disponibile per client: strategie'. Immagino che venga dalla configurazione Zuul che si aspetta informazioni dal server di rilevamento dei servizi, in questo caso Eureka, per indirizzare la chiamata verso l'ip corretto. – Kilian