前言
打桩某个类或接口一般用两个注解:@Mock和@Spy,一般用Mock是最多的。下面我们看看两个示例。
Mock
@Mock是不执行具体对象内的方法逻辑,该注解用bytebuddy生成的是一个代理子类非真实方法,返回的都是NULL或Empty。基本配合when…thenReturn返回需要的对象值即可。当然也可用这种写法(doCallRealMethod)执行到具体的真实类方法。
@Mock
private XxxService xxxService;
@Before
public void setUp() throws Exception {
//开启注解支持
MockitoAnnotations.initMocks(this);
XxxInfo i1 = new XxxInfo();
i1.setAddr("http://localhost:8080");
Mockito.when(xxxService.selectByPrimaryKey(anyLong())).thenReturn(i1);
//
Mockito.doCallRealMethod().when(xxxService).selectByPrimaryKey(anyLong());
}
Spy
Spy机制可以监视一个真实对象,对其进行方法调用会执行真实逻辑;spy也可以打桩指定的方法。需要注意的是你打桩的类是接口的话必须要new 出指定的实现类,试想一下一个接口要执行到具体的类方法你不进行告知具体的实现类是哪一个机器也是不知道的。
@Spy
private XxxService xxxService = new XxxServiceImpl();
@Before
public void setUp() throws Exception {
//开启注解支持
MockitoAnnotations.initMocks(this);
XxxInfo i1 = new XxxInfo();
i1.setAddr("http://localhost:8080");
Mockito.when(xxxService.selectByPrimaryKey(anyLong())).thenReturn(i1);
}
不指定实现类则抛异常
org.mockito.exceptions.base.MockitoException: Cannot create a @Spy for ‘XxxService’ field because the *instance* is missing
Example of correct usage of @Spy:
@Spy List mock = new LinkedList();
when…thenReturn和doAnswer…when的区别示例
- 当我们为模拟对象指定调用其方法的返回值时, when…thenReturn用于直接返回一个简单的值。
- 当模拟对象调用它的方法,需要执行一些操作(其实就是需要执行一个代码块)才能得到返回值时,则需要使用doAnswer来构造产生这个模拟的返回值。
@Mock
private XxxService xxxService;
@Before
public void setUp() throws Exception {
//开启注解支持
MockitoAnnotations.initMocks(this);
XxxInfo i1 = new XxxInfo();
i1.setAddr("http://localhost:8080");
when(xxxService.selectByPrimaryKey(anyLong())).thenReturn(i1);
doAnswer(invocation -> {
XxxInfo i2 = new XxxInfo();
i2.setAddr("http://www.caodegao.com:8080");
return i2;
}).when(xxxService).selectByPrimaryKey(1L);
}