匿名内部类测试注意事项

目的方法

public void foo(){
    transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    boolean success = transactionTemplate.execute(new TransactionCallback<Boolean>() {
        @Override
        public Boolean doInTransaction(TransactionStatus status) {
            try {
                barService.bar();
                return true;
            } catch (ApiException e) {
                System.out.println("call bar failed");
                e.printStackTrace();
                status.setRollbackOnly();
            }
            return false;
        }
    });
    if(success){
        barService.doSomething();
    }else{
        barService.doSomethingElse();
    }
}

测试方法

@Test
public void test_foo_call_bar_failed(){
    Mockito.doThrow(new ApiException("100000","Test")).when(barService).bar(); // 模拟调用bar方法抛出异常
 
    service.foo();
 
    Mockito.verify(barService).bar();
    Mockito.verify(barService).doSomethingElse(); // 表示执行了doSomethingElse方法
    Mockito.verify(barService,Mockito.times(0)).doSomething();
}

但是实际执行上面的测试用例 报错

java.lang.NullPointerException
    at com.foobar.service.FooService.foo(FooService.java:68)

似乎匿名内部类不能这样简答处理
修改测试方法

@Test
public void test_foo_call_bar_failed(){
    when(transactionTemplate.execute(Mockito.any(TransactionCallback.class))).thenAnswer(new Answer(){
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            Object[] args = invocation.getArguments();
            TransactionCallback arg = (TransactionCallback)args[0];
            return arg.doInTransaction(new SimpleTransactionStatus());
        }
    });
    Mockito.doThrow(new ApiException("100000","Test")).when(barService).bar();
 
    service.foo();
 
    Mockito.verify(barService).bar();
    Mockito.verify(barService).doSomethingElse();
    Mockito.verify(barService,Mockito.times(0)).doSomething();
}

这时就能测试通过了。

参考文档
http://stackoverflow.com/ques...

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值