Como verificar se um método não é chamado na dependência de um objeto?
Por exemplo:
public interface Dependency {
void someMethod();
}
public class Foo {
public bar(final Dependency d) {
...
}
}
Com o teste 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
é a maneira melhor e mais específica, mas se você precisar verificar um objeto falso inteiro, considere tambémverifyZeroInteractions(mockObject)
ouverifyNoMoreInteractions(mockObject)
.verifyZeroInteractions
foi preterido.verifyNoInteractions
é a alternativa sugerida. A versão do Mockito no momento deste comentário é 3.3.3use o segundo argumento no
Mockito.verify
método, como em:verify(dependency, Mockito.times(0)).someMethod()
fonte
never()
não é significativamente mais legível quetimes(0)
. Mas a existência denever
aumenta a carga cognitiva e torna o sistema mockito mais difícil de entender e lembrar como usar. Então, o mockito realmente não deveria ter incluídonever
em sua API, não vale o custo mental.someMethod
foi chamado 0 vezes ou apenassomeMethod
se nunca foi chamado com zero argumentos?someMethod
com zero argumentos foi chamado zero vezes, não verificado.Como padrão mais geral a seguir, costumo usar um
@After
bloco no teste:Em seguida, o teste é gratuito para verificar apenas o que deve ser chamado.
Além disso, descobri que muitas vezes esquecia de verificar "sem interações", apenas para descobrir mais tarde que estavam sendo chamadas coisas que não deveriam ter acontecido.
Portanto, acho esse padrão útil para capturar todas as chamadas inesperadas que não foram especificamente verificadas.
fonte
verifyNoMoreInteractions
? As outras respostas aqui se baseiam no autor do teste, lembrando-se explicitamente de listar essas verificações: isso é muito propenso a erros no meu livro.Primeiro de tudo: você deve sempre importar mockito estático, assim o código será muito mais legível (e intuitivo):
Na verdade, existem muitas maneiras de conseguir isso, mas é (sem dúvida) mais limpo usar o
método em todos os seus testes, quando em outros testes você o usa para afirmar uma certa quantidade de execuções como esta:
As alternativas são:
Como alternativa - quando você realmente quer ter certeza de que um determinado objeto zombado NÃO é realmente chamado -, você pode usar:
fonte
O método
verifyNoMoreInteractions()
everifyZeroInteractions()
internamente têm a mesma implementação que:portanto, podemos usar qualquer um deles em objetos simulados ou matriz de objetos simulados para verificar se nenhum método foi chamado usando objetos simulados.
fonte