Java - 如何测试 Catch block ?

标签 java unit-testing mockito try-catch catch-block

有点转发,但是关于没有足够声誉的第 22 条军规意味着我无法对任何重复的线程发表评论! (咳咳)

我正在尝试使用 Mockito 测试 try-catch 的 catch block ;是否可以使模拟抛出由正在测试的方法处理的异常?我无法使用 doThrow()...when()... 或 @Test(expected = Foo.class) 因为异常已处理。我想测试该方法是否正确处理异常。

@Controller
public class StockExchangeController {

    public ModelAndView placeOrder(ModelAndView mav, MyObj myObj) {

        try {
            validator.validate(myObj); // Throws CustomException if validation fails
            mav.setViewName("successPage");

        } catch (CustomException ex) {
            mav.setViewName("failPage");
        }

        return mav;
    }
}

我希望能够 stub 我的“validatorObject”的行为,例如

doThrow(new CustomException()).when(validatorMock).validate();

有办法做到这一点吗?

答案 here (Test catch block logic with Junit and mockito) 不起作用(我相信),因为异常在达到测试级别之前已被处理。

非常感谢提示和想法!

最佳答案

BDD风格解决方案

Mockito 单独使用并不是处理异常的最佳解决方案,请将 MockitoCatch-Exception 结合使用

莫基托 + Catch-Exception + AssertJ
given(otherServiceMock.bar()).willThrow(new MyException());

when(myService).foo();

then(caughtException()).isInstanceOf(MyException.class);
示例代码 依赖关系
  • eu.codearte.catch-异常:catch-异常:1.3.3
  • org.assertj:assertj-core:1.7.0
坏处
  • 仅支持 Mockito 1.10.8 及更高版本

关于Java - 如何测试 Catch block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51003098/

相关文章:

java - ArgumentCaptor 的问题和对相同方法的连续调用(错误或功能?)

java - 当服务触发操作时如何通知 Activity

java - 判断一个数是否是4的幂,logNum % logBase == 0 vs (logNum/logBase) % 1 == 0

java - 告诉枚举要使用什么子类类型

unit-testing - 单元测试中的多个断言

java - 测试 Spring Boot REST 资源问题

java - 如何将 Android 按钮放置在 TextView 之上?

node.js - 使用 Jest(和 mockgoose)测试 Node.js API

javascript - 监视 jasmine 中的 jquery ui 小部件

java - Mockito 和 PowerMockito 错误