Pendeknya:
@Spy
dan @Mock
sering digunakan dalam pengujian kode, tetapi pengembang bingung dalam kasus kapan harus menggunakan salah satunya dan dengan demikian pengembang akhirnya menggunakan @Mock
agar aman.
- Gunakan
@Mock
jika Anda ingin menguji fungsionalitas secara eksternal
tanpa benar-benar memanggil metode itu.
- Gunakan
@Spy
ketika Anda ingin menguji fungsionalitas secara eksternal + internal dengan metode yang dipanggil.
Di bawah ini adalah contoh di mana saya telah mengambil skenario Election20xx di Amerika.
Pemilih dapat dibagi menurut VotersOfBelow21
danVotersOfABove21
.
Exit poll yang ideal mengatakan bahwa Trump akan memenangkan pemilihan karena VotersOfBelow21
dan VotersOfABove21
keduanya akan memilih truf dengan mengatakan " Kami memilih Presiden Trump "
Tapi ini bukan skenario sebenarnya:
Pemilih dari kedua kelompok usia memilih Trump karena mereka tidak punya pilihan efektif lain selain Trump.
Jadi bagaimana cara mengujinya ??
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;
}
}
Sekarang Catatan di dua kelas pertama di atas, kedua kelompok usia orang mengatakan bahwa mereka tidak memiliki pilihan yang lebih baik daripada truf. Yang secara eksplisit berarti bahwa mereka memilih Trump hanya karena mereka tidak punya pilihan.
Sekarang ElectionOfYear20XX
dikatakan bahwa Trump menang karena kedua kelompok umur sangat memilihnya.
Jika kita Menguji ElectionOfYear20XX
mengujinya dengan @Mock, maka kami mungkin tidak bisa mendapatkan alasan sebenarnya mengapa Trump menang, kami hanya akan menguji alasan eksternal.
Jika kita mengujinya ElectionOfYear20XX
dengan @Spy, maka kita mendapatkan alasan sebenarnya mengapa Trump menang dengan hasil exit poll eksternal, yaitu secara internal + eksternal.
ELectionOfYear20XX_Test
Kelas kami :
@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"));
}
}
Ini harus mengeluarkan hanya hasil tes logika yaitu pemeriksaan eksternal:
We elected President Trump
We elected President Trump
Menguji dengan @Spy
eksternal maupun internal dengan pemanggilan metode aktual.
@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"));
}
}
Keluaran:
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