Zusamenfassend:
@Spy
und @Mock
werden häufig beim Testen von Code verwendet, aber Entwickler verwirren in Fällen, in denen sie einen von ihnen verwenden müssen, und daher verwenden Entwickler letztendlich @Mock
, um sicher zu sein.
- Verwenden
@Mock
Sie diese Option, wenn Sie die Funktionalität nur extern testen möchten
ohne diese Methode tatsächlich aufzurufen.
- Verwenden
@Spy
Sie diese Option, wenn Sie die Funktionalität extern + intern mit der aufgerufenen Methode testen möchten .
Unten ist das Beispiel, in dem ich das Szenario von Election20xx in Amerika aufgenommen habe.
Die Wähler können nach VotersOfBelow21
und unterteilt werden VotersOfABove21
.
Die ideale Exit - Umfrage sagt , dass Trump die Wahl gewinnen wird , da VotersOfBelow21
und VotersOfABove21
beide stimmen für Trumpf sagen : „ Wir gewählte Präsident Trump “
Dies ist jedoch nicht das eigentliche Szenario:
Wähler beider Altersgruppen stimmten für Trump, weil sie keine andere effektive Wahl hatten als Herrn Trump.
Wie testest du es?
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;
}
}
Beachten Sie nun, dass in den ersten beiden Klassen beide Altersgruppen sagen, dass sie keine bessere Wahl haben als Trump. Was ausdrücklich bedeutet, dass sie für Trump gestimmt haben, nur weil sie keine Wahl hatten.
Jetzt ElectionOfYear20XX
sagt der , dass Trump gewonnen hat, weil beide Altersgruppen ihn mit überwältigender Mehrheit gewählt haben.
Wenn wir das testen würden ElectionOfYear20XX
mit @Mock testen würden, könnten wir möglicherweise nicht den wahren Grund herausfinden, warum Trump gewonnen hat. Wir werden nur den externen Grund testen.
Wenn wir das ElectionOfYear20XX
mit @Spy testen, erhalten wir den wahren Grund, warum Trump mit den Ergebnissen der externen Exit-Umfrage gewonnen hat, dh intern + extern.
Unsere ELectionOfYear20XX_Test
Klasse:
@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"));
}
}
Dies sollte nur die logischen Testergebnisse ausgeben, dh externe Prüfung:
We elected President Trump
We elected President Trump
Testen sowohl @Spy
extern als auch intern mit tatsächlichem Methodenaufruf.
@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"));
}
}
Ausgabe:
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