Escribí el código que llama a la camiseta de la API de cliente que a su vez llama a un servicio web que está fuera de mi control. No quiero que mi unidad de prueba para llamar al servicio web real.

Cuál es el mejor enfoque para la escritura de una unidad de prueba para el código que llama a la camiseta de la API de cliente? Debo usar el Jersey servidor API para escribir un JAX-RS servicio web y, a continuación, utilizar el Jersey en el Marco de Prueba para la prueba de la unidad? O debería burlarse de el Jersey de llamadas de servicio web? Tengo acceso a JMock. O debería intentar otro enfoque?

Durante mi investigación, he encontrado esta discusión que se describen las distintas opciones, pero encontré una solución completa. Hay ejemplos de código disponibles mostrando una propuesta de JUnit enfoque? No pude encontrar ninguna en la camiseta de la documentación.

Aquí es el correspondiente código fuente:

public String getResult(URI uri) throws Exception {
  //error handling code removed for clarity
  ClientConfig clientConfig = new DefaultClientConfig();
  Client client = Client.create(clientConfig);
  WebResource service = client.resource(uri);
  String result = service.accept(accept).get(String.class);
  return result;
}

Aquí están los ejemplos de código de prueba me gustaría pasar. Me gustaría probar (1) el paso de un URI válido y conseguir una cadena válida y (2) pasando no es válida (por el motivo que sea — inalcanzable o no autorizado) y el URI de obtener una excepción de la espalda.

@Test
public void testGetResult_ValidUri() throws Exception {
  String xml = retriever.getResult(VALID_URI);
  Assert.assertFalse(StringUtils.isBlank(xml));
}

@Test(expected = IllegalArgumentException.class)
public void testGetResult_InvalidUri() throws Exception {
  retriever.getResult(INVALID_URI);
}

Todo lo anterior es la simple descripción de lo que mi código no. En realidad, hay una capa en la parte superior de aquel que acepta dos URIs, primero intenta llamar a la primera URI, y si que URI falla, a continuación, intenta llamar a la segunda URI. Me gustaría tener pruebas unitarias de cobertura (1) la primera URI se realiza correctamente, (2) la primera URI falla y el segundo URI se realiza correctamente, y (3) ambas Uri fallar. Este código es lo suficientemente complejo para que quiero probar estos diferentes escenarios de uso de JUnit, pero para ello necesita para ejecutar real soporte de servicios web o burlarse de el Jersey cliente de llamadas a la API.

  • ¿Qué es exactamente lo que usted desea probar con este método? ¿Cuáles son los critereas, que se pasa la prueba?
  • Bueno, Si quieres hacer la prueba de unidad, a continuación, usted debe tener la adecuada funcional de los servicios.
  • He actualizado la pregunta con la que quiero probar (1) el paso de un URI válido y conseguir una cadena válida y (2) pasando no es válida (por el motivo que sea — inalcanzable o no autorizado) y el URI de obtener una excepción de la espalda.

3 Comentarios

  1. 15

    Intentar utilizar Mockito o Easymock para burlarse de las llamadas de servicio. Usted necesita sólo para burlarse de estos métodos que se usa en realidad, no hay necesidad de burlarse de cada método. Usted puede crear el objeto mock para WebResource clase, luego de burlarse de aceptar la llamada al método.

    En @BeforeClass/@Antes de la prueba de JUnit método de escribir algo como (Mockito ejemplo)

    WebResource res = mock(WebResource.class);
    when(res.accept(something)).thenReturn(thatWhatYouWant);

    A continuación, en las pruebas se puede utilizar res objeto como si fuera el objeto real y llame a burlarse de método. En lugar de devolver un valor también puede lanzar excepciones. Mockito es bastante cool.

    • Esta es la respuesta correcta. Hacer de todo un servicio web es gastar esfuerzo en las pruebas de Jersey código cuando yo ya sé que funciona. Quiero poner a prueba mi código. Terminé teniendo que refactorizar las llamadas a la camiseta código a otra clase, la adición de un setter, y se burla de la nueva clase. Esto funcionó a la perfección y me permitió probar los diferentes escenarios en realidad yo quería probar. Mi equipo es el uso de JMock así que terminé con eso, pero de cualquier marco de trabajo ficticios va a hacer.
    • Estoy un poco confundido ya que el Mockito sitio web dice que «no se burlan de tipo no es suya!» ¿Dónde trazamos una línea en cuanto a lo que podemos simulacros frente a lo que no. Hay una manera mejor?
  2. 13

    Por lo general lo que son realmente los que después se «¿es la manera de utilizar el Jersey Cliente de ADSL producir una petición a la URL correcta, con la correcta carga y los parámetros de URL». Las pruebas de este con Mockito es muy detallado y el código de configuración generalmente terminan buscando algo como esto:

        when(authentication.queryParam(eq("sa"), anyBoolean())).thenReturn(testAuthentication);
        when(testAuthentication.resolveTemplate("channel", "smf")).thenReturn(testAuthentication);
        when(testAuthentication.request(
                MediaType.APPLICATION_JSON_TYPE)).thenReturn(mockRequestBuilder);
        when(mockRequestBuilder.post(any(Entity.class))).thenReturn(mockResponse);
        when(mockResponse.readEntity(ResponseWrapper.class)).thenReturn(successfulAuthResponse());

    Y esto es básicamente por una sola RESTO de solicitud. Es demasiado detallado, y en lugar de probar el esperado resultado simplemente de replicar los pasos que creo que son correctas en el uso de la camiseta Cliente de ADSL.

    En lugar de la anterior, me gustaría unirme para burlarse de un simple servicio. Para esto he usado WireMock que se inicia un servidor Jetty y donde puedo punta de cosas como «esperar una solicitud a esta dirección URL, responder con este mensaje y verificar que la carga útil es este».

    Sé que esto es ribete en un test de integración y es un poco más lento que usar Mockito pero yo valor de las pruebas el resultado real y valoro la legibilidad de las pruebas de manera más en este caso.

    De la instalación de un WireMock basado en Jersey Cliente de prueba se ve algo como esto:

    @Test
    public void exactUrlOnly() {
        stubFor(get(urlEqualTo("/some/thing"))
                .willReturn(aResponse()
                    .withHeader("Content-Type", "text/plain")
                    .withBody("Hello world!")));
    
       assertThat(testClient.get("/some/thing").statusCode(), is(200));
       assertThat(testClient.get("/some/thing/else").statusCode(), is(404));
    }
    • +1 para WireMock – gran herramienta. En mi caso, Mockito no podía burlarse de WebResource.Generador (final), resuelto con WireMock
  3. 0

    Acaba de implementar un trabajo igual de servicio y en su unidad de prueba de configuración de inicio del servicio, el uso de HttpServerFactory.

Dejar respuesta

Please enter your comment!
Please enter your name here