Pregunta

Soy nuevo en jmock e intento burlarme de una HttpSession. Estoy obteniendo:

java.lang.AssertionError: invocación inesperada: httpServletRequest.getSession () sin expectativas especificadas: ¿usted ...  - ¿Olvidaste comenzar una expectativa con una cláusula de cardinalidad?  - llamar a un método simulado para especificar el parámetro de una expectativa?

el método de prueba:

@Test

public void testDoAuthorization(){

    final HttpServletRequest request = context.mock(HttpServletRequest.class);
    final HttpSession session = request.getSession();

    context.checking(new Expectations(){{
       one(request).getSession(true); will(returnValue(session));
   }});

    assertTrue(dwnLoadCel.doAuthorization(session));
}

He hecho un poco de búsqueda y aún no me queda claro cómo se hace esto. Parece que me falta alguna pieza pequeña. Cualquier persona con experiencia en esto puede señalarme en la dirección correcta. gracias

¿Fue útil?

Solución

No necesita burlarse del objeto de solicitud. Dado que el método que está probando ( dwnLoadCel.doAuthorization () ) solo depende de un objeto HttpSession , eso es lo que debe burlarse. Entonces su código se vería así:

public void testDoAuthorization(){
    final HttpSession session = context.mock(HttpSession.class);

    context.checking(new Expectations(){{
        // ???
    }});

    assertTrue(dwnLoadCel.doAuthorization(session));

}

La pregunta se convierte en: ¿qué espera que el SUT haga con el objeto de sesión? Debe expresar en sus expectativas las llamadas a session y sus valores de retorno correspondientes que se supone que resultan en doAuthorization que devuelve true .

Otros consejos

Creo que debes decirle al contexto de JMock cuántas veces esperas que se llame al método antes de seguir adelante y llamarlo.

final HttpServletRequest request = context.mock(HttpServletRequest.class);

context.checking(new Expectations(){{
  one(request).getSession(true); will(returnValue(session));
}});

final HttpSession session = request.getSession();

No estoy muy familiarizado con JMock pero, ¿realmente te importa en tu unidad dwnLoadCel probar cuántas veces se llaman ciertos métodos en el objeto simulado? ¿O simplemente está tratando de probar su clase que depende de una HttpSession sin una sesión real? Si es lo último, creo que JMock es excesivo para ti.

Es posible que desee analizar la creación de una clase que implemente la interfaz HttpSession para los fines de pruebas unitarias solamente (un talón), y ejecutar sus pruebas fuera de eso, o debería tomar Eche un vistazo a dwnLoadCel y determine si realmente necesita tener una referencia a HttpSession, o si solo necesita algunas propiedades dentro de HttpSession. Refactorice dwnLoadCel para que solo dependa de lo que realmente necesita (un Mapa o un determinado valor de parámetro dentro del objeto Session): esto hará que su prueba de unidad sea más fácil (la dependencia de la el contenedor de servlets se va adiós).

Creo que ya se está probando cierto nivel de inyección de dependencia en su clase, pero es posible que dependa de un objeto demasiado amplio. El blog de Google Test ha tenido mucho de excelente artículos en DI últimamente que pueden ser útiles (seguro que tengo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top