添加关注
刚使用Mockito来做Java项目的单元测试时,对doAnswer…when的使用场合不怎么理解,查了Mockito的官方文档和网上的各种资料,感觉都说得不够清楚。后来自己用它在项目中做了些unit tests,终于弄明白了。
原来,doAnswer…when和when…thenReturn的功能类似,都是用于给模拟对象指定调用其方法后的返回值,只不过二者有如下区别:
01
when…thenReturn:
当我们为模拟对象指定调用其方法的返回值时, when…thenReturn用于直接返回一个简单的值。
02
doAnswer…when:
当模拟对象调用它的方法,需要执行一些操作(其实就是需要执行一个代码块)才能得到返回值时,则需要使用doAnswer来构造产生这个模拟的返回值。例如:当模拟对象调用某个方法的返回值是个复合值(bean)时,就需要用doAnswer来构造该返回值。
下面通过代码来看它们的使用场合, 首先是使用when…thenReturn的代码:
@Mock
private SecurityBean testSecurity;
...
@Before
public void init() {
try {
...
Mockito.when(testSecurity.getSecurityId()).thenReturn("testSecurityId");
...
} catch (Exception e) {
log.error("errorin setting up mocked responses", e);
}
}
上面灰色背景代码为testSecurity这个模拟对象指定当它调用getSecurityId()这个方法时, 将得到 "testSecurityId" 这个字符串作为返回值。
接下来再看使用doAnswer…when的代码:
@Mock
private StockDao stockDao;
...
@Before
public void init() {
try {
...
doAnswer(new Answer<StockModel>) {
@Override
public StockModel answer(InvocationOnMock invocation) throws Throwable {
StockModel stock = new StockModel ();
stock.setFundFamilyName("fundFamily01");
return stock;
}
}).when(stockDao).lookup("testStock");
...
} catch (Exception e) {
log.error("error in setting up mocked responses", e);
}
}
上面灰色背景代码为stockDao这个模拟对象指定当它调用lookup()这个方法(参数为 "testStock" )时, 将得到一个fundFamilyName为指定值的StockModel对象作为返回值。
本文结束