domingo, 3 de junio de 2018

Wiremock: Nivel Avanzado II

Ya hice un post de wiremock avanzado aquí. Para evitar hacerlos muy largos y pesados prefiero hacerlos en secciones y aquí esta la segunda.
  • Verificación de llamadas
Esto esta realmente bien sobre todo para pruebas JUnit, en las cuales tu wiremock esta integrado en una solución más amplia. A través de esta propiedad, podremos comprobar si se ha llamado al wiremock e incluso con que datos se le han llamado. 

@Rule
public WireMockRule wireMockRule = new WireMockRule(WireMockConfiguration.options().port(8085));
@Before
public void setup() {
    String body = "{\"id\":1,\"title\":\"1984\",\"author\":\"George Orwell\"}";
    ResponseDefinitionBuilder response = WireMock.aResponse().withBody(body).withStatus(200)  .withHeader("Content-Type", "application/json");
    WireMock.stubFor(WireMock.get("/book/1").willReturn(response));
}
public void finish() {
    wireMockRule.shutdown();
}
@Test
public void testGetRequestedFor() {
    try {
        URL url = new URL("http://localhost:8085/book/1");
 HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
 con.setRequestProperty("User-Agent", "Mozilla/5.0");
 verify(1, getRequestedFor(urlEqualTo("/book/1")).withHeader("User-Agent", equalTo("Mozilla/5.0")));
    } catch (Exception except) {
        except.printStackTrace();
    }
}
  • Coincidencia de llamadas
No siempre vamos a saber exactamente los valores con los cuales se nos va a llamar, pero puede que tengamos una idea aproximada. Y que aunque no conozcamos la llamada exacta si que sabemos que patrón va a seguir. Para eso tenemos el 'request matching' que nos permitirá buscar coincidencias en: URL, métodos HTTP, query params, headers, autenticación, cookies o body.
Esta propiedad nos servirá tanto para crear los mock como para verificar las llamadas que se realizan. Y se nos permitirá buscar por coincidencias exactas, parciales o por valores concretos en rutas de jsonpath. 

@Test
public void testGetRequestedFor() {
    try {
        URL url = new URL("http://localhost:8085/book/1");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
 con.setRequestProperty("User-Agent", "Mozilla/5.0");
 verify(1, getRequestedFor(urlPathMatching("/book/[0-9]+")).withHeader("User-Agent",
      equalToIgnoreCase("mozilla/5.0")));
    } catch (Exception except) {
        except.printStackTrace();
    }
}
  • Plantillas de respuesta
Esta opción nos vendrá genial para cuando queramos hacer respuestas generales, y queramos que la respuesta vaya en función de la llamada. En nuestro ejemplo solo haremos el uso de dos tipos de plantillas, pero se pueden hacer con más valores de la llamada. Y lo que es más interesante con partes del mensaje de entrada, obteniendo los valores con XPath o JsonPath.

Debemos tener eso sí dos aspectos a tener en cuenta. Por un lado debemos activar el uso de las plantillas y por otro, que para poder usar estas plantillas necesitamos enmarcarlas entre dobles llaves '{{}}'.

@Rule
public WireMockRule wireMockRule = new WireMockRule(  
 WireMockConfiguration.options().port(8085).extensions(
  new ResponseTemplateTransformer(false))
);
@Before
public void setup() {
  WireMock.stubFor(get(urlMatching("/book/[0-9]*")).willReturn(
  aResponse().withBody("{\"id\": {{request.path.[1]}},\"User-Agent\": {{request.headers.User-Agent}} }")
   .withTransformers("response-template")));
}
public void finish() {
    wireMockRule.shutdown();
}
@Test
public void testGetRequestedFor() {
    try {
        URL url = new URL("http://localhost:8085/book/7");
 HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
 con.setRequestProperty("User-Agent", "Mozilla/5.0");
 String response = IOUtils.toString(con.getInputStream(), "UTF-8");
 String body = "{\"id\": 7,\"User-Agent\": Mozilla/5.0 }";
 Assert.assertEquals(response, body);
    } catch (Exception except) {
        except.printStackTrace();
    }
}

Aparte de esto hay bastante más para hacer con wiremock, pero al menos nos vamos haciendo una idea de las cosas más básicas y útiles que podemos llegar a hacer.

No hay comentarios:

Publicar un comentario