Kısacası:
@Spyve @Mockkodun test edilmesinde yoğun bir şekilde kullanılır, ancak geliştiriciler bunlardan birini ne zaman kullanacakları konusunda kafa karıştırırlar ve bu nedenle geliştiriciler @Mockgüvenli olmak için kullanmaya başlarlar.
-
Bu yöntemi gerçekten çağırmadan
@Mockyalnızca işlevselliği harici olarak test etmek istediğinizde kullanın .
- Çok çağrılan yöntemle
@Spyişlevselliği harici olarak + dahili olarak test etmek istediğinizde kullanın .
Aşağıda Amerika'da Election20xx senaryosunu aldığım örnek var .
Verenler göre ayrılabilir VotersOfBelow21ve VotersOfABove21.
İdeal Çık anket çünkü Trump seçimleri kazanacağını söylüyor VotersOfBelow21ve VotersOfABove21her iki koz söyleyerek oy verecektir " Başkan Trump seçildi "
Ancak bu gerçek senaryo değil:
Her iki yaş grubundan seçmenler de Trump'a oy verdi çünkü Trump'tan başka etkili seçenekleri yoktu.
Peki nasıl test edersiniz?
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;
}
}
Şimdi, yukarıdaki ilk iki sınıfa dikkat edin, her iki yaş grubu da kozdan daha iyi bir seçeneğe sahip olmadıklarını söylüyor. Bu açıkça, sırf başka seçenekleri olmadığı için Trump'a oy verdikleri anlamına geliyor.
Şimdi, ElectionOfYear20XX Trump'ın her iki yaş grubunun da ezici bir çoğunlukla ona oy vermesi nedeniyle kazandığını söylüyor.
ElectionOfYear20XX@Mock ile Test edersek, Trump'ın kazanmasının gerçek sebebini bulamayabiliriz, sadece dış sebebi test etmiş oluruz.
ElectionOfYear20XX@ Spy ile test edersek, o zaman Trump'ın neden harici çıkış anket sonuçlarıyla, yani dahili + harici olarak kazanmasının gerçek sebebini anlarız.
Bizim ELectionOfYear20XX_Testsınıfı:
@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"));
}
}
Bu, yalnızca mantık testi sonuçlarının çıktısını almalıdır , yani harici kontrol:
We elected President Trump
We elected President Trump
@SpyGerçek yöntem çağrısı ile harici ve dahili olarak test etme .
@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"));
}
}
Çıktı:
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