¿Cómo verificar que no se llamó a un método específico usando Mockito?
¿ Cómo verificar que un método no se llama en función de 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??**
}
}
Aún más significativo:
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
// ...
verify(dependency, never()).someMethod();
La documentación de esta función se encuentra en el §4 "Verificación del número exacto de invocaciones/al menos x/nunca" , y el never
javadoc está aquí .
Utilice el segundo argumento del Mockito.verify
método, como en:
Mockito.verify(dependency, Mockito.times(0)).someMethod()
Primero que nada: siempre debes importar mockito static, de esta manera el código será mucho más legible (e intuitivo):
import static org.mockito.Mockito.*;
En realidad, hay muchas maneras de lograr esto, sin embargo, es (posiblemente) más limpio usar el
verify(yourMock, times(0)).someMethod();
método en todas sus pruebas, cuando en otras pruebas lo usa para afirmar una cierta cantidad de ejecuciones como esta:
verify(yourMock, times(5)).someMethod();
Las alternativas son:
verify(yourMock, never()).someMethod();
Alternativamente, cuando realmente desee asegurarse de que un determinado objeto simulado NO sea llamado en absoluto, puede usar:
verifyZeroInteractions(yourMock)
Tenga en cuenta: verificarZeroInteractions(Object... simulacros) está en desuso. Desde la versión 3.0.1. El método ahora recomendado es:
verifyNoInteractions(yourMock)