Mockito中实现前29次调用doNothing、第30次抛异常的方法
解决Mockito指定Stubbing调用次数的问题
不用手动写29次doNothing()啦,Mockito本身就提供了优雅的方式来指定不同调用次数对应的行为,完全不需要重复代码。
先说说你原来写法的问题:when(dao, times(30))这种语法是错误的,Mockito的when方法并不接受times()作为第二个参数,正确的Stubbing逻辑应该通过链式调用的方式来组合次数和行为。
正确的实现代码
@Mock DAOclass dao; @Test(expected = ArithmeticException.class) public void AAA() throws SQLException { // 核心写法:指定前29次调用methodABC时执行doNothing,第30次抛出异常 doNothing().times(29).doThrow(ArithmeticException.class).when(dao).methodABC(); for (int i = 0; i < 30; i++) { dao.methodABC(); // 注意:你原来写的dao.nothing()应该是笔误,要调用Stubbing的目标方法 } }
原理说明
Mockito的Stubbing API支持链式调用:
doNothing()定义了默认的行为(什么都不做).times(29)指定这个行为会被触发29次- 之后的
.doThrow(ArithmeticException.class)会在第30次调用methodABC时生效
这样既满足了你的需求,又保持了代码的简洁性,完全不用手动重复写29次doNothing()。另外还要注意循环里的方法调用要和Stubbing的方法一致,不然Stubbing的规则不会生效哦。
内容的提问来源于stack exchange,提问作者user7968180
相关产品推荐
相关产品推荐

