Em resumo:
@Spy
e @Mock
são muito usados em testes de código, mas os desenvolvedores confundem os casos de quando usar um deles e, portanto, os desenvolvedores acabam usando @Mock
para estarem seguros.
- Use
@Mock
quando quiser apenas testar a funcionalidade externamente,
sem realmente chamar esse método.
- Use
@Spy
quando quiser testar a funcionalidade externa + internamente com o próprio método que está sendo chamado.
Abaixo está o exemplo de onde tirei o cenário de Election20xx na América.
Os eleitores podem ser divididos de acordo com VotersOfBelow21
e VotersOfABove21
.
A pesquisa de saída ideal diz que Trump vai ganhar a eleição porque VotersOfBelow21
e VotersOfABove21
ambos vão votar em trunfo dizendo " Nós elegemos o presidente Trump "
Mas este não é o cenário real:
Os eleitores de ambos os grupos etários votaram em Trump porque não tinham outra escolha eficaz além do Sr. Trump.
Então, como você testa ??
public class VotersOfAbove21 {
public void weElected(String myVote){
System.out.println("Voters of above 21 has no Choice Than Thrump in 20XX ");
}
}
public class VotersOfBelow21 {
public void weElected(String myVote){
System.out.println("Voters of below 21 has no Choice Than Thrump in 20XX");
}
}
public class ElectionOfYear20XX {
VotersOfAbove21 votersOfAbove21;
VotersOfBelow21 votersOfBelow21;
public boolean weElected(String WeElectedTrump){
votersOfAbove21.weElected(WeElectedTrump);
System.out.println("We elected President Trump ");
votersOfBelow21.weElected(WeElectedTrump);
System.out.println("We elected President Trump ");
return true;
}
}
Agora observe nas duas primeiras classes acima, ambas as pessoas da faixa etária dizem que não têm escolha melhor do que trunfo. O que significa explicitamente que votaram em Trump apenas porque não tinham escolha.
Agora, o ElectionOfYear20XX
diz que Trump ganhou porque ambas as faixas etárias votaram nele de forma esmagadora.
Se fôssemos testar o ElectionOfYear20XX
com @Mock, talvez não consigamos descobrir a verdadeira razão pela qual Trump venceu, estaremos apenas testando a razão externa.
Se testarmos ElectionOfYear20XX
com @Spy, obteremos a verdadeira razão pela qual Trump ganhou com os resultados da pesquisa de saída externa, ou seja, internamente + externamente.
Nossa ELectionOfYear20XX_Test
classe:
@RunWith(MockitoJUnitRunner.class)
public class ELectionOfYear20XX_Test {
@Mock
VotersOfBelow21 votersOfBelow21;
@Mock
VotersOfAbove21 votersOfAbove21;
@InjectMocks
ElectionOfYear20XX electionOfYear20XX;
@Test
public void testElectionResults(){
Assert.assertEquals(true,electionOfYear20XX.weElected("No Choice"));
}
}
Isso deve produzir apenas os resultados do teste lógico, ou seja, verificação externa:
We elected President Trump
We elected President Trump
Testando @Spy
externamente e internamente com invocação de método real.
@RunWith(MockitoJUnitRunner.class)
public class ELectionOfYear20XX_Test {
@Spy
VotersOfBelow21 votersOfBelow21;
@Spy
VotersOfAbove21 votersOfAbove21;
@InjectMocks
ElectionOfYear20XX electionOfYear20XX;
@Test
public void testElectionResults(){
Assert.assertEquals(true,electionOfYear20XX.weElected("No Choice"));
}
}
Resultado:
Voters of above 21 has no Choice Than Thrump in 20XX
We elected President Trump
Voters of below 21 has no Choice Than Thrump in 20XX
We elected President Trump