2016-05-06 7 views
10

Piszę jakiś test integracyjny na moim kontrolerze REST, używając MockRestServiceServer do korygowania zachowania backendu. Co próbuję teraz osiągnąć, to symulować bardzo powolną reakcję z backendu, co ostatecznie doprowadziłoby do przekroczenia limitu czasu w mojej aplikacji. Wygląda na to, że można go zaimplementować z WireMockiem, ale w tej chwili chciałbym trzymać się MockRestServiceServer.MockRestServiceServer symuluje limit czasu backendu w teście integracji

tworzę serwer tak:

myMock = MockRestServiceServer.createServer(asyncRestTemplate); 

A potem ja przedrzeźniając moje zachowanie backend jak:

myMock.expect(requestTo("http://myfakeurl.blabla")) 
      .andExpect(method(HttpMethod.GET)) 
      .andRespond(withSuccess(myJsonResponse, MediaType.APPLICATION_JSON)); 

Czy jest możliwe aby dodać jakieś opóźnienia lub przekroczenia limitu czasu lub inny rodzaj opóźnienia odpowiedzi (a może cały wyśmiewany serwer, a nawet mój asyncRestTemplate)? Czy powinienem po prostu przejść na WireMock, a może Restito?

+0

Patrz także: https://stackoverflow.com/a/47750157/ 838434 – MaDa

Odpowiedz

0

Ogólnie rzecz biorąc, możesz zdefiniować swój niestandardowy moduł obsługi żądań i zrobić tam nieprzyjemny numer Thread.sleep().

To byłoby możliwe w Restito z czymś takim.

Action waitSomeTime = Action.custom(input -> { 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     throw new RuntimeException(e); 
    } 
    return input; 
}); 

whenHttp(server).match(get("/asd")) 
     .then(waitSomeTime, ok(), stringContent("Hello World")) 

Nie jestem jednak pewien Spring. Możesz łatwo spróbować. Sprawdź inspirację pod numerem DefaultResponseCreator.

7

można zrealizować przetestować tę funkcjonalność w ten sposób (Java 8):

myMock 
    .expect(requestTo("http://myfakeurl.blabla")) 
    .andExpect(method(HttpMethod.GET)) 
    .andRespond(request -> { 
     try { 
      Thread.sleep(TimeUnit.SECONDS.toMillis(1)); 
     } catch (InterruptedException ignored) {} 
     return new MockClientHttpResponse(myJsonResponse, HttpStatus.OK); 
    }); 

Ale muszę cię ostrzec, że od MockRestServiceServer prostu zastępuje RestTemplate requestFactory wszelkie ustawienia requestFactory Byłbyś zostaną utracone w teście środowisko.

0

Podejście, na które można przejść: Określanie obiektu odpowiedzi za pomocą zasobu Ścieżka klasy lub zawartości normalnego łańcucha. Bardziej szczegółowa wersja tego, co Skeeve zasugerowano powyżej

.andRespond(request -> { 
      try { 
       Thread.sleep(TimeUnit.SECONDS.toMillis(5)); // Delay 
      } catch (InterruptedException ignored) {} 
      return withStatus(OK).body(responseBody).contentType(MediaType.APPLICATION_JSON).createResponse(request); 
     }); 
1

W Restito, istnieje funkcja buil w celu symulacji timeout:

import static com.xebialabs.restito.semantics.Action.delay 

whenHttp(server). 
    match(get("/something")). 
    then(delay(201), stringContent("{}"))