Qual é a diferença entre @Mock
e @InjectMocks
no framework Mockito?
java
unit-testing
mocking
mockito
user2249972
fonte
fonte
Respostas:
@Mock
cria uma farsa.@InjectMocks
cria uma instância da classe e injeta as simulações criadas com as anotações@Mock
(ou@Spy
) nessa instância.Observe que você deve usar
@RunWith(MockitoJUnitRunner.class)
ouMockito.initMocks(this)
para inicializar essas simulações e injetá-las.fonte
Este é um código de exemplo de como
@Mock
e@InjectMocks
funciona.Digamos que temos
Game
ePlayer
classe.Como você vê, a
Game
classe precisaPlayer
executar umattack
.Mockito irá zombar de uma classe Player e seu comportamento usando
when
ethenReturn
método. Por fim, usar o@InjectMocks
Mockito colocará issoPlayer
emGame
.Observe que você nem precisa criar um
new Game
objeto. Mockito irá injetá-lo para você.Também obteremos o mesmo comportamento usando a
@Spy
anotação. Mesmo se o nome do atributo for diferente.Isso porque Mockito irá verificar a
Type Signature
classe Game, que éPlayer
eList<String>
.fonte
Na sua classe de teste, a classe testada deve ser anotada
@InjectMocks
. Isso informa ao Mockito em qual classe injetar zombarias:A partir de então, podemos especificar quais métodos ou objetos específicos dentro da classe, neste caso
SomeManager
, serão substituídos por zombarias:Neste exemplo,
SomeDependency
dentro daSomeManager
classe será ridicularizado.fonte
@Mock
anotação zomba do objeto em questão.@InjectMocks
A anotação permite injetar no objeto subjacente as diferentes (e relevantes) simulações criadas por@Mock
.Ambos são complementares.
fonte
@InjectMocks
para construir essa classe e espioná-la também.Por exemplo
Aqui precisamos da classe DAO para a classe de serviço. Portanto, zombamos e injetamos na instância da classe de serviço. Da mesma forma, no framework Spring, todos os beans @Autowired podem ser zombados pelo @Mock nas jUnits e injetados no seu bean através do @InjectMocks.
MockitoAnnotations.initMocks(this)
O método inicializa essas simulações e as injeta em todos os métodos de teste, portanto, ele precisa ser chamado nosetUp()
método.Este link tem um bom tutorial para o framework Mockito
fonte
Uma "estrutura de zombaria", na qual o Mockito se baseia, é uma estrutura que permite criar objetos Mock (em termos antigos, esses objetos podem ser chamados de desvios, pois funcionam como desvios para a funcionalidade dependente) Em outras palavras, um mock objeto é usado para imitar o objeto real do qual seu código depende, você cria um objeto proxy com a estrutura de simulação. Ao usar objetos simulados em seus testes, você basicamente passa do teste de unidade normal para o teste de integração
O Mockito é uma estrutura de teste de código aberto para Java lançada sob a licença MIT, é uma "estrutura de zombaria", que permite escrever belos testes com API limpa e simples. Existem muitas estruturas de simulação diferentes no espaço Java, no entanto, existem essencialmente dois tipos principais de estruturas de objetos de simulação, aquelas implementadas via proxy e aquelas implementadas via remapeamento de classe.
Estruturas de injeção de dependência como o Spring permitem que você injete seus objetos proxy sem modificar nenhum código, o objeto simulado espera que um determinado método seja chamado e retornará um resultado esperado.
A
@InjectMocks
anotação tenta instanciar a instância do objeto de teste e injeta campos anotados com@Mock
ou@Spy
em campos particulares do objeto de teste.MockitoAnnotations.initMocks(this)
chame, redefina o objeto de teste e reinicialize as simulações; lembre-se de tê-lo em sua@Before
/@BeforeMethod
anotação.fonte
Uma vantagem que você obtém com a abordagem mencionada pelo @Tom é que você não precisa criar construtores no SomeManager e, portanto, limitar os clientes a instanciar.
Se é uma boa prática ou não, depende do design do seu aplicativo.
fonte
Muitas pessoas têm dado um grande explicação aqui sobre
@Mock
vs@InjectMocks
. Eu gosto, mas acho que nossos testes e aplicativos devem ser escritos de uma maneira que não precisemos usar@InjectMocks
.Referência para leituras adicionais com exemplos: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/
fonte
@Mock
é usado para declarar / zombar das referências dos beans dependentes, enquanto@InjectMocks
é usado para zombar do bean para o qual o teste está sendo criado.Por exemplo:
teste para classe
A
:fonte
A anotação @InjectMocks pode ser usada para injetar campos simulados em um objeto de teste automaticamente.
No exemplo abaixo, @InjectMocks usou para injetar o dataMap simulado na dataLibrary.
fonte
Observe que
@InjectMocks
está prestes a ser preteridoe você pode seguir a resposta @avp e o link :
fonte
Embora as respostas acima tenham sido abordadas, apenas tentei adicionar detalhes minuciosos que vejo faltando. A razão por trás deles (The Why).
Ilustração:
Referência
fonte