¿Cómo se usa Jmock con HttpSession y HttpServletRequest?
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
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).