En bref:
@Spy
et @Mock
sont largement utilisés dans les tests de code, mais les développeurs ne savent pas quand utiliser l'un d'eux et donc les développeurs finissent par utiliser @Mock
pour être sûrs.
- À utiliser
@Mock
lorsque vous souhaitez simplement tester la fonctionnalité en externe
sans appeler cette méthode.
- À utiliser
@Spy
lorsque vous souhaitez tester la fonctionnalité en externe + en interne avec la méthode même appelée.
Voici l'exemple où j'ai pris le scénario d' Election20xx en Amérique.
Les électeurs peuvent être divisés selon VotersOfBelow21
et VotersOfABove21
.
Le sondage de sortie idéal dit que Trump gagnera les élections parce VotersOfBelow21
que les VotersOfABove21
deux voteront pour Trump en disant " Nous avons élu le président Trump "
Mais ce n'est pas le vrai scénario:
Les électeurs des deux groupes d'âge ont voté pour Trump parce qu'ils n'avaient pas d'autre choix efficace que M. Trump.
Alors, comment le tester?
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;
}
}
Notez maintenant que dans les deux premières classes ci-dessus, les deux personnes du groupe d'âge disent qu'elles n'ont pas de meilleur choix que Trump. Ce qui signifie explicitement qu'ils ont voté pour Trump simplement parce qu'ils n'avaient pas le choix.
Maintenant, le ElectionOfYear20XX
dit que Trump a gagné parce que les deux groupes d'âge ont voté pour lui à une écrasante majorité.
Si nous devions tester le ElectionOfYear20XX
avec @Mock, alors nous ne serions peut-être pas en mesure d'obtenir la vraie raison pour laquelle Trump a gagné, nous allons simplement tester la raison externe.
Si nous testons le ElectionOfYear20XX
avec @Spy, alors nous obtenons la vraie raison pour laquelle Trump a gagné avec les résultats du sondage de sortie externe, c'est-à-dire en interne + en externe.
Notre 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"));
}
}
Cela devrait produire uniquement les résultats du test logique, c'est-à-dire une vérification externe:
We elected President Trump
We elected President Trump
Test en @Spy
externe et en interne avec un appel de méthode réel.
@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"));
}
}
Production:
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