W skrócie:
@Spy
i @Mock
są często używane w testowaniu kodu, ale programiści mylą się w przypadkach, gdy używają jednego z nich, a zatem programiści używają go, @Mock
aby być bezpiecznym.
- Użyj,
@Mock
jeśli chcesz po prostu przetestować funkcjonalność zewnętrznie,
bez wywoływania tej metody.
- Użyj,
@Spy
gdy chcesz przetestować funkcjonalność zewnętrznie + wewnętrznie, przy użyciu samej wywoływanej metody.
Poniżej znajduje się przykład, w którym wziąłem scenariusz Election20xx w Ameryce.
Głosujących można podzielić według VotersOfBelow21
i VotersOfABove21
.
Idealna exit poll mówi, że Trump wygra wybory bo VotersOfBelow21
i VotersOfABove21
jak będzie głosować na Trump mówiąc: „ Mamy wybrany prezydent Trump ”
Ale to nie jest prawdziwy scenariusz:
Wyborcy z obu grup wiekowych głosowali na Trumpa, ponieważ nie mieli innego skutecznego wyboru niż Trump.
Jak więc to przetestować?
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;
}
}
Teraz uwaga w powyższych dwóch pierwszych klasach, obie grupy wiekowe mówią, że nie mają lepszego wyboru niż atut. Co wyraźnie oznacza, że głosowali na Trumpa tylko dlatego, że nie mieli wyboru.
Teraz ElectionOfYear20XX
mówi, że Trump wygrał, ponieważ obie grupy wiekowe głosowały na niego w przeważającej mierze.
Gdybyśmy mieli przetestować ElectionOfYear20XX
pomocą @Mock, moglibyśmy nie być w stanie znaleźć prawdziwego powodu, dla którego Trump wygrał, po prostu przetestujemy powód zewnętrzny.
Jeśli przetestujemy ElectionOfYear20XX
z @Spy, otrzymamy prawdziwy powód, dla którego Trump wygrał z wynikami zewnętrznego sondażu, tj. Wewnętrznie + zewnętrznie.
Nasza ELectionOfYear20XX_Test
klasa:
@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"));
}
}
Powinno to wyprowadzić tylko wyniki testów logicznych, tj. Sprawdzenie zewnętrzne:
We elected President Trump
We elected President Trump
Testowanie zarówno @Spy
zewnętrznie, jak i wewnętrznie z rzeczywistym wywołaniem metody.
@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"));
}
}
Wynik:
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