viernes, 13 de abril de 2018

Wiremock: Nivel Avanzado I


Ya anteriormente hicimos un post sobre conocimientos básicos de wiremock aquí. Con este quiero empezar una serie corta sobre aspectos más avanzados de wiremock y de utilidad. 
  • Prioridad
Por defecto, si al indicar dos posibles mapeos si hay una URL de llamada que coincide con ambos, wiremock realizará el último de los mapeos configurados. Para evitar esta circunstancia podemos indicar una prioridad a la hora de crear el mapeo. Esta prioridad se puede indicar con valores enteros, empezando por el 1, el valor de mayor prioridad. Para llevarlo a cabo debemos usar el método 'atPriority' e indicar el valor deseado.

@Test
public void testrB1984Priority() {
    ResponseDefinitionBuilder rB1984 = WireMock.aResponse().withBody(b1984).withStatus(200)
      .withHeader("Content-Type", "application/json");
    ResponseDefinitionBuilder rbTTiger = WireMock.aResponse().withBody(bTTiger).withStatus(200)
      .withHeader("Content-Type", "application/json");
    WireMock.stubFor(WireMock.get("/book/1").atPriority(1).willReturn(rB1984));
    WireMock.stubFor(WireMock.get("/book/1").willReturn(rbTTiger));
    Book book = client.getBook(1);
    Assert.assertEquals(book.getTitle(), "1984");
}
@Test
public void testrbTTiger() {
    ResponseDefinitionBuilder rB1984 = WireMock.aResponse().withBody(b1984).withStatus(200)
      .withHeader("Content-Type", "application/json");
    ResponseDefinitionBuilder rbTTiger = WireMock.aResponse().withBody(bTTiger).withStatus(200)
      .withHeader("Content-Type", "application/json");
    WireMock.stubFor(WireMock.get("/book/1").willReturn(rB1984));
    WireMock.stubFor(WireMock.get("/book/1").willReturn(rbTTiger));
    Book book = client.getBook(1);
    Assert.assertEquals(book.getTitle(), "The stars my destination");
}
  • Respuesta por defecto para mapeos no configurados
Por defecto si no encuentra la url a la que se llama, wiremock devuelve un error 404 y una página HTML en el body de la respuesta. Podremos sustituirla tras crear un mapeo personalizado e indicar que cualquier URL encaje con esta. De esta forma y al declararla primero si no encuentra alguna URL concreta devolverá dicho mapeo.

@Test
public void setDefaultErrorMapping() throws ClientProtocolException, IOException {
    ResponseDefinitionBuilder error = WireMock.aResponse().withBody(mError).withStatus(404);
    WireMock.stubFor(any(anyUrl()).willReturn(error));
    ResponseDefinitionBuilder rB1984 = WireMock.aResponse().withBody(b1984).withStatus(200)
  .withHeader("Content-Type", "application/json");
    WireMock.stubFor(WireMock.get("/book/1").willReturn(rB1984));
    HttpUriRequest request = new HttpGet("http://localhost:8085/book/2");
    HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);
    assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_NOT_FOUND));
    assertThat(EntityUtils.toString(httpResponse.getEntity()), equalTo(mError));
}
  • Estados
Wiremock nos permite la asociación de estados a los mapeos. Algo muy util si queremos emular como se comportará nuestro sistema con reintentos, por ejemplo. Al comenzar, nuestro mapeo siempre será asociado al estado 'Scenario.STARTED', pero nosotros podremos crear todos los estados que queramos. El funcionamiento básico es indicar en que escenario nos encontramos con el método 'inScenario' y luego podremos indicar en que estado se encontrará el mapeo con 'whenScenarioStateIs' y a que estado se moverá con 'willSetStateTo'.

@Test
public void testrB1984State() {
    ResponseDefinitionBuilder rB1984_501 = WireMock.aResponse().withStatus(503)
        .withHeader("Content-Type","application/json");
    ResponseDefinitionBuilder rB1984_200 = WireMock.aResponse().withBody(b1984)
        .withStatus(200).withHeader("Content-Type", "application/json");
    WireMock.stubFor(WireMock.get("/book/1").inScenario("rB1984")
        .willSetStateTo("responseOK").willReturn(rB1984_501));
    WireMock.stubFor(WireMock.get("/book/1").inScenario("rB1984")
        .whenScenarioStateIs("responseOK").willReturn(rB1984_200));
    HttpUriRequest request = new HttpGet("http://localhost:8085/book/1");
    HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);
    assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_SERVICE_UNAVAILABLE));
    httpResponse = HttpClientBuilder.create().build().execute(request);
    assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
}

No hay comentarios:

Publicar un comentario