Answer接口说明
对mock对象的方法进行调用预期的设定,可以通过thenReturn()来指定返回值,thenThrow()指定返回时所抛异常,通常来说这两个方法足以应对一般的需求。但有时我们需要自定义方法执行的返回结果,Answer接口就是满足这样的需求而存在的。另外,创建mock对象的时候所调用的方法也可以传入Answer的实例mock(java.lang.Class<T> classToMock, Answer defaultAnswer),它可以用来处理那些mock对象没有stubbing的方法的返回值。
使用方法
@Test(expected = BatchExecutException.class)
public void testCheckExcepHaltForSendGooods01() {
SendGoodsParams params = new SendGoodsParams();
params.createParams(20, user.getTaobaoId());
Long[] taobaoIdsArray = params.taobaoIds.toArray(new Long[20]);
Long[] tidsArray = params.tids.toArray(new Long[20]);
Long[] sysTidArray = params.sysTids.toArray(new Long[20]);
Mockito.when(tradeQueryServiceNoSolr.queryByPrimaryKeysBase(Mockito.any(User.class),
Mockito.anyList(), Mockito.anyBoolean())).then(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
List<TradePrimaryKey> tradePrimaryKeys = (List<TradePrimaryKey>) args[1];
List<TbTrade> trades = new ArrayList<TbTrade>();
for (TradePrimaryKey tpk : tradePrimaryKeys) {
TbTrade temp = new TbTrade();
temp.setId(1L);
temp.setTaobaoId(tpk.getTaobaoId());
temp.setTid(tpk.getTid());
temp.setSysTid(tpk.getSysTid());
temp.setMergeSplitType(0);
TbOrder tbOrder = new TbOrder();
tbOrder.setTid(tpk.getTid());
tbOrder.setOid(tpk.getTid());
tbOrder.setRefundId("1111");
tbOrder.setMergeSplitType(0);
tbOrder.setRefundStatus(TbOrder.REFUND_WAIT_BUYER_RETURN_GOODS);
temp.setOrders(Arrays.asList(new TbOrder[]{tbOrder}));
trades.add(temp);
}
return trades;
}
});
tradeService.__checkExcepHaltForSendGooods(user, taobaoIdsArray, tidsArray,
sysTidArray, SendGoodTag.TYPE.OFFLINE);
}
使用Anser时,如果你测试时,可以从外部传入参数调用到这个方法,那么就不需要使用any。如果这个mock方法调用的参数,是内部创建出来的,那么只能使用any。