mock与spy的区别
1. mock
指定需要mock的类型类(接口或者实现类),生成 Mock 类,其中所有的方法都不是真实的方法,而且返回值都是NULL或者Empty。
1.1 mock对象的方法不执行具体逻辑
使用mock对象,访问对象方法不会执行具体逻辑
@Test
public void testGetGiftList_mock_normal_gift() {
GiftModel mockGiftModel = Mockito.mock(GiftModel.class);
List<String> giftList = mockGiftModel.getGiftList(0);
System.out.println("mock normalGiftList: " + giftList);
}
输出
mock normalGiftList: []
1.2 使用方法打桩返回给定数据
@Test
public void testGetGiftList_mock_stub_normal_gift() {
List<String> result = new ArrayList<>();
result.add("Stub");
Mockito.when(mockGiftModel.getGiftList(0)).thenReturn(result);
List<String> giftList = mockGiftModel.getGiftList(0);
System.out.println("mock normalGiftList: " + giftList);
}
输出:
mock normalGiftList: [Stub]
1.3 mock如何执行具体逻辑?
@Test
public void testGetGiftList_callRealMethod_mock_normal_gift() {
Mockito.doCallRealMethod().when(mockGiftModel).getGiftList(0);
List<String> giftList = mockGiftModel.getGiftList(0);
System.out.println("doCallRealMethod normalGiftList: " + giftList);
}
输出:
doCallRealMethod normalGiftList: [normal]
待测试类
public class GiftModel {
public GiftModel() {
}
public List<String> getGiftList(int level) {
if (level == 0) {
return getNormalGiftList();
} else {
return getLuxuryGiftList();
}
}
private List<String> getNormalGiftList() {
ArrayList<String> gifts = new ArrayList<>();
gifts.add("normal");
return gifts;
}
private List<String> getLuxuryGiftList() {
ArrayList<String> gifts = new ArrayList<>();
gifts.add("luxury");
return gifts;
}
}
2. spy
spy机制可以监视一个真实对象,对其进行方法调用会执行真实逻辑;spy也可以打桩指定的方法。
2.1 spy对象的方法执行具体逻辑
@Test
public void testGetGiftList_spy_luxury_gift() {
GiftModel spyGiftModel = Mockito.spy(GiftModel.class);
List<String> giftList = spyGiftModel.getGiftList(1);
System.out.println("spy luxuryGiftList: " + giftList);
}
输出
spy luxuryGiftList: [luxury]
2.2 spy如何不执行具体逻辑?
spy中使用doReturn…when打桩,不会执行具体逻辑
spy中使用when…thenReturn打桩,会执行具体逻辑
@Test
public void testGetGiftSum_spy_first_doReturn() {
Mockito.doReturn(1).when(spyGiftModel).getGiftSum();
System.out.println("spy getGiftSum: " + spyGiftModel.getGiftSum());
}
@Test
public void testGetGiftSum_spy_first_when() {
Mockito.when(spyGiftModel.getGiftSum()).thenReturn(2);
System.out.println("spy getGiftSum: " + spyGiftModel.getGiftSum());
}
运行结果:
spy getGiftSum: 1
call real method
spy getGiftSum: 2
待测方法:
public int getGiftSum() {
System.out.println("call real method");
return 100;
}