Nói ngắn gọn:
@Spy
và @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
@Mock
khi 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
@Spy
khi 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 VotersOfBelow21
và 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ì VotersOfBelow21
và VotersOfABove21
cả 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 ElectionOfYear20XX
vớ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 ElectionOfYear20XX
bằ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_Test
Lớ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 @Spy
bê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