java - uso - test unitarios junit mockito
¿Hay una manera de tener algo como jUnit Argumento de mensaje de afirmación en el método de verificación de Mockito? (4)
Asumamos un fragmento de código de prueba:
Observable model = Class.forName(fullyQualifiedMethodName).newInstance();
Observer view = Mockito.mock(Observer.class);
model.addObserver(view);
for (Method method : Class.forName(fullyQualifiedMethodName).getDeclaredMethods())
{
method.invoke(model, composeParams(method));
model.notifyObservers();
Mockito.verify(
view, Mockito.atLeastOnce()
).update(Mockito.<Observable>any(), Mockito.<Object>any());
}
Mockito.verify
método Mockito.verify
lanza una excepción si un método en un modelo no ha invocado el método Observable.setChanged()
.
Problema: sin agregar loggers/System.print.out
no me doy cuenta de cuál es el método actual que no loggers/System.print.out
la prueba. ¿Hay alguna forma de tener algo similar a los métodos de jUnit Assert
:
Assert.assertEquals(
String.format("instances %s, %s should be equal", inst1, inst2),
inst1.getParam(),
inst2.getParam()
);
SOLUCIÓN:
verify(observer, new VerificationMode()
{
@Override
public void verify(VerificationData data)
{
assertTrue(
format(
"method %s doesn''t call Observable#setChanged() after changing the state of the model",
method.toString()
),
data.getAllInvocations().size() > 0);
}
}).update(Mockito.<Observable>any(), Mockito.<Object>any());
Esto hace el truco (simple y claro):
try {
verify(myMockedObject, times(1)).doSomthing();
} catch (MockitoAssertionError e) {
throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage());
}
No hay una llamada API directa que permita un mensaje en verificar. Pero creo que si cambia su firma de verificación para usar el objeto de método en lugar de Mockito.any (), la toString () en la clase de Método se activará y le dará lo que desea.
Algo como esto.
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
import static org.mockito.Matchers.eq;
...
Observable model = Class.forName("class name").newInstance();
verify(view, times(1)).update(eq(model), anyObject());
for (Method method : Class.forName("class name").getDeclaredMethods())
{
method.invoke(model, composeParams(method));
model.notifyObservers();
verify(view, atLeastOnce()).update(eq(method), anyObject());
}
No se puede hacer en mockito. La sintaxis de Mockito hace que sea muy fácil probar el comportamiento esperado, pero no tiene un concepto de estado de prueba.
Lo que intentas hacer es tener alguna información que no esté en el objeto simulado cuando la simulación no supera las expectativas.
Si realmente quieres hacerlo, veo dos formas generales: o bien creas tu propio Modo de verificación implementando la interfaz
org.mockito.verification;
public static interface VerificationMode
y agregar un método como atLeastOnceMsd (String msg) que mostrará el mensaje en caso de fallar o agregar el método probado actual en el modelo al objeto de vista
por ejemplo, con una línea similar en el bucle interno.
view.setName("now we are testing " + method.getName());
Podría crear un comparador para imprimir información sobre el método actual. Va a ser un poco torpe, pero funcionará imprimir el nombre del método cuando la verificación falla.