2009-02-04 16 views
42

Estoy usando Mockito para escribir una prueba unitaria en Java, y me gustaría verificar que un determinado método es el último llamado en un objeto.Use Mockito para verificar que no se llame nada después de un método

que estoy haciendo algo como esto en el código bajo prueba:

row.setSomething(value); 
row.setSomethingElse(anotherValue); 
row.editABunchMoreStuff(); 
row.saveToDatabase(); 

En mi maqueta, que no se preocupan por el orden en que edito todo en la fila, pero es muy importante que I no intente hacer algo más después de haberlo guardado. ¿Existe una forma correcta de hacer esto?

Tenga en cuenta que no estoy buscando verifyNoMoreInteractions: no confirma que saveToDatabase es lo último que se llamó, y también falla si llamo a algo en la fila que no verifico explícitamente. Me gustaría poder decir algo como:

verify(row).setSomething(value); 
verify(row).setSomethingElse(anotherValue); 
verifyTheLastThingCalledOn(row).saveToDatabase(); 

Si ayuda, estoy cambiando a Mockito de una prueba JMock que hizo esto:

row.expects(once()).method("saveToDatabase").id("save"); 
row.expects(never()).method(ANYTHING).after("save"); 
+5

Una nota del futuro: finalmente refactorizamos esto para evitar la dependencia orden. Específicamente, movimos la parte saveToDatabase() a una capa externa del código, donde se llamaría automáticamente en el momento adecuado. En general, si necesitas hacer algo como esto con un simulacro, tus pruebas te dicen que debes refactorizar. Dicho esto, sigue siendo agradable tener una prueba que pueda funcionar hasta que se cambie el diseño. –

Respuesta

52

creo que requiere más personalizada trabajo.

verify(row, new LastCall()).saveToDatabase(); 

y luego

public class LastCall implements VerificationMode { 
    public void verify(VerificationData data) { 
     List<Invocation> invocations = data.getAllInvocations(); 
     InvocationMatcher matcher = data.getWanted(); 
     Invocation invocation = invocations.get(invocations.size() - 1); 
     if (!matcher.matches(invocation)) throw new MockitoException("..."); 
    } 
} 

respuesta anterior:

Tiene usted razón. verifyNoMoreInteractions es lo que necesita.

verify(row).setSomething(value); 
verify(row).setSomethingElse(anotherValue); 
verify(row).editABunchMoreStuff(); 
verify(row).saveToDatabase(); 
verifyNoMoreInteractions(row); 
+0

No, no lo es. He actualizado la pregunta para aclarar por qué. –

+0

Oh wow. Me perdí tu actualización hasta que estaba revisando viejas preguntas en este momento, de lo contrario hubiera votado antes. Eso parece exactamente lo que necesito. ¡Gracias! –

+1

error de compilación: deseado no se puede resolver – kmalmur

0

Esta pregunta me llevó a hacer algunas mejoras a la Verificaciones API en JMockit (disponible en la próxima versión 0.983).

La solución que se me ocurrió permite escribir (en un método de prueba):


    new VerificationsInOrder() {{ 
     unverifiedInvocations(); 
     row.saveToDababase(); 
    }}; 

... si sólo desea verificar que un determinado método se llama después de todo lo demás. Para verificar que ocurra antes de todas las demás invocaciones, simplemente mueva la llamada a la parte superior. Esto en realidad se aplica a cualquier secuencia de invocaciones consecutivas.

Si además de la verificación anterior, también desea comprobar que algunos otros métodos son llamados en cualquier orden, un segundo verificaciones bloque puede ser añadido a la prueba (antes o después del otro bloque, que doesn' t materia):


    new Verifications() {{ 
     row.setSomething(value); 
     row.setSomethingElse(anotherValue); 
    }}; 

Aunque un poco largo debido a la utilización de clases internas anónimas, esta sintaxis es simple y flexible; observe cómo agrega estructura a la prueba y evita la repetición de llamadas a métodos (como verify(...)). Hay más que lo que describí aquí (emparejamientos de Hamcrest, recuentos de invocación, etc.), y no está limitado a la verificación de los métodos de instancia (los métodos estáticos y los constructores pueden ser burlados y verificados de la misma manera).

9

No estaba al 100% en el tema pero solo buscaba encontrar lo opuesto a verificar, y este fue el único resultado relevante, termina buscando Mockito.verifyZeroInteractions (simulacro);

Sólo en caso cualquier otra persona termina aquí en busca de esto ...

Cuestiones relacionadas