¿Cómo verificar que un método no se invoque en la dependencia de un objeto?
Por ejemplo:
public interface Dependency {
void someMethod();
}
public class Foo {
public bar(final Dependency d) {
...
}
}
Con la prueba de Foo:
public class FooTest {
@Test
public void dependencyIsNotCalled() {
final Foo foo = new Foo(...);
final Dependency dependency = mock(Dependency.class);
foo.bar(dependency);
**// verify here that someMethod was not called??**
}
}
never
es la forma mejor y más específica, pero si necesita verificar un objeto simulado completo, también considereverifyZeroInteractions(mockObject)
overifyNoMoreInteractions(mockObject)
.verifyZeroInteractions
ha quedado en desuso.verifyNoInteractions
Es la alternativa sugerida. La versión de Mockito en el momento de este comentario es 3.3.3use el segundo argumento sobre el
Mockito.verify
método, como en:verify(dependency, Mockito.times(0)).someMethod()
fuente
never()
no es significativamente más legible quetimes(0)
. Pero la existencia denever
sí aumenta la carga cognitiva y hace que el sistema mockito sea más difícil de entender y recordar cómo usarlo. Así que realmente mockito no debería haber incluidonever
en su API, no vale la pena el costo mental.someMethod
se llamó 0 veces, o solo verifica quesomeMethod
nunca se llamó con cero argumentos?someMethod
con cero argumentos se llamó cero veces, no verificado.Como un patrón más general a seguir, tiendo a usar un
@After
bloque en la prueba:Entonces la prueba es libre de verificar solo lo que debería llamarse.
Además, descubrí que a menudo me olvidaba de verificar "no interacciones", solo para descubrir más tarde que se llamaban cosas que no deberían haber sido.
Por lo tanto, considero que este patrón es útil para capturar todas las llamadas inesperadas que no se han verificado específicamente.
fuente
verifyNoMoreInteractions
? Las otras respuestas aquí se basan en que el escritor de la prueba recuerda explícitamente enumerar estas comprobaciones: eso es demasiado propenso a errores en mi libro.En primer lugar: siempre debe importar mockito static, de esta manera el código será mucho más legible (e intuitivo):
En realidad, hay muchas maneras de lograr esto, sin embargo, es (posiblemente) más limpio usar el
método en todas sus pruebas, cuando en otras pruebas lo usa para afirmar una cierta cantidad de ejecuciones como esta:
Las alternativas son:
Alternativamente, cuando realmente desea asegurarse de que cierto Objeto burlado en realidad NO se llame en absoluto, puede usar:
fuente
Tanto el
verifyNoMoreInteractions()
yverifyZeroInteractions()
método tiene internamente la misma aplicación como:para que podamos usar cualquiera de ellos en un objeto simulado o una matriz de objetos simulados para verificar que no se haya llamado a ningún método utilizando objetos simulados.
fuente