Nói ngắn gọn:
@Spyvà @Mockđược sử dụng nhiều trong việc thử nghiệm mã, nhưng các nhà phát triển thường nhầm lẫn trong trường hợp khi nào sử dụng một trong số chúng và do đó các nhà phát triển kết thúc việc sử dụng @Mockđể được an toàn.
- Sử dụng
@Mockkhi bạn muốn chỉ kiểm tra chức năng bên ngoài
mà không thực sự gọi phương thức đó.
- Sử dụng
@Spykhi bạn muốn kiểm tra chức năng bên ngoài + bên trong với chính phương thức đang được gọi.
Dưới đây là ví dụ mà tôi đã thực hiện kịch bản Bầu cử20xx ở Mỹ.
Các phiếu bầu có thể được chia theo VotersOfBelow21và VotersOfABove21.
Cuộc thăm dò lý tưởng của Exit nói rằng Trump sẽ giành chiến thắng trong cuộc bầu cử bởi vì VotersOfBelow21và VotersOfABove21cả hai sẽ bỏ phiếu cho Trump nói rằng " Chúng tôi đã bầu Tổng thống Trump "
Nhưng đây không phải là kịch bản thực:
Cử tri ở cả hai nhóm tuổi đã bỏ phiếu cho Trump vì họ không có sự lựa chọn hiệu quả nào khác ngoài ông Trump.
Vì vậy, làm thế nào để bạn kiểm tra nó ??
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;
}
}
Bây giờ Lưu ý trong hai lớp học đầu tiên ở trên, cả hai nhóm tuổi nói rằng họ không có lựa chọn nào tốt hơn so với át chủ bài. Điều đó rõ ràng có nghĩa là họ bỏ phiếu cho Trump chỉ vì họ không có sự lựa chọn.
Bây giờ người ElectionOfYear20XX ta nói rằng Trump đã thắng vì cả hai nhóm tuổi đã bỏ phiếu cho anh ta một cách áp đảo.
Nếu chúng tôi kiểm tra ElectionOfYear20XXvới @Mock, thì chúng tôi có thể không biết được lý do thực sự tại sao Trump thắng, chúng tôi sẽ chỉ kiểm tra lý do bên ngoài.
Nếu chúng ta kiểm tra ElectionOfYear20XXbằng @Spy, thì chúng ta sẽ biết được lý do thực sự tại sao Trump thắng với kết quả thăm dò ý kiến từ bên ngoài, tức là bên trong + bên ngoài.
ELectionOfYear20XX_TestLớp chúng tôi :
@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"));
}
}
Điều này sẽ chỉ xuất ra kết quả kiểm tra logic, tức là kiểm tra bên ngoài:
We elected President Trump
We elected President Trump
Kiểm tra với @Spybên ngoài cũng như bên trong với lệnh gọi phương pháp thực tế.
@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"));
}
}
Đầu ra:
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