Eu sou novo em Mockito.
Dada a classe abaixo, como posso usar o Mockito para verificar se someMethod
foi chamado exatamente uma vez depois de ter foo
sido chamado?
public class Foo
{
public void foo(){
Bar bar = new Bar();
bar.someMethod();
}
}
Gostaria de fazer a seguinte chamada de verificação,
verify(bar, times(1)).someMethod();
Onde bar
é uma instância zombada de Bar
.
java
unit-testing
junit
mockito
senhor
fonte
fonte
Respostas:
Injeção de dependência
Se você injetar a instância Bar, ou uma fábrica usada para criar a instância Bar (ou uma das outras 483 maneiras de fazer isso), você terá o acesso necessário para realizar o teste.
Exemplo de fábrica:
Dada uma classe Foo escrita assim:
no seu método de teste, você pode injetar um BarFactory como este:
Bônus: Este é um exemplo de como o TDD pode orientar o design do seu código.
fonte
Bar bar = mock(Bar.class)
em vez deBar bar = new Bar();
BarFactory myFactory = mock(BarFactory.class); when(myFactory.createBar()).thenReturn(bar);
A resposta clássica é: "Você não". Você testa a API pública de
Foo
, não suas internas.Existe algum comportamento do
Foo
objeto (ou menos bom, algum outro objeto no ambiente) que é afetadofoo()
? Se sim, teste isso. E se não, o que o método faz?fonte
Foo
épublic void foo()
, onde os internos são relacionados apenas a barras.verify()
se torne muito útil, mesmo que você não esteja mais adorando no altar sagrado dos testes de integração.Se você não quiser usar DI ou Fábricas. Você pode refatorar sua classe de uma maneira um pouco complicada:
E sua classe de teste:
Em seguida, a classe que está chamando seu método foo fará o seguinte:
Como você pode ver ao chamar o método dessa maneira, não é necessário importar a classe Bar em nenhuma outra classe que esteja chamando seu método foo, que talvez seja algo que você deseja.
Obviamente, a desvantagem é que você está permitindo que o chamador defina o Objeto de barra.
Espero que ajude.
fonte
Solução para o seu código de exemplo usando
PowerMockito.whenNew
FooTest.java
Saída JUnit
fonte
Eu acho que Mockito
@InjectMocks
é o caminho a percorrer.Dependendo da sua intenção, você pode usar:
Mais informações nos documentos
Abaixo está um exemplo com injeção de campo:
Aulas:
Teste:
fonte
Sim, se você realmente deseja / precisa fazer isso, pode usar o PowerMock. Isso deve ser considerado um último recurso. Com o PowerMock, você pode fazer com que ele retorne uma simulação da chamada ao construtor. Em seguida, verifique a simulação. Dito isto, csturtz's é a resposta "certa".
Aqui está o link para a construção simulada de novos objetos
fonte
Outra maneira simples seria adicionar alguma instrução de log ao bar.someMethod () e verificar se você pode ver a mensagem mencionada quando o teste foi executado, veja exemplos aqui: Como fazer uma JUnit afirmar uma mensagem em um logger
Isso é especialmente útil quando o seu Bar.someMethod () é
private
.fonte