Kısacası:
@Spy
ve @Mock
kodun 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 @Mock
güvenli olmak için kullanmaya başlarlar.
-
Bu yöntemi gerçekten çağırmadan
@Mock
yalnızca işlevselliği harici olarak test etmek istediğinizde kullanın .
- Çok çağrılan yöntemle
@Spy
iş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 VotersOfBelow21
ve VotersOfABove21
.
İdeal Çık anket çünkü Trump seçimleri kazanacağını söylüyor VotersOfBelow21
ve VotersOfABove21
her 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_Test
sı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
@Spy
Gerç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