EasyMock 测试代码中间抛出异常

EasyMock test an exception is thrown in the middle of code

我正在用EasyMock写测试,有一段源码是这样的:

public void doSomething(){
    try
    {
        // Do something
    }
    catch (RejectedExecutionException ex)
    {
        // just add some metrics here, no big action
    }
}

我正在为抛出 RejectedExecutionException 的情况编写测试,但最终没有抛出异常,这意味着我无法使用 ExpectedException。那么我应该如何测试使用 EasyMock 抛出一次这个异常?

我不认为你有一个干净的方法来用任何模型框架来做到这一点。不过,我可以向您建议以下解决方案。

解决方案 1

doSomething()的代码修改如下:

public void doSomething(){
    try
    {
        doSomethingImpl(); // throws RejectedExecutionException
    }
    catch (RejectedExecutionException ex)
    {
        // just add some metrics here, no big action
    }
}. 

现在对应该抛出异常的 doSomethingImpl() 和不应使用相同输入数据和状态的 doSomething() 实施测试。

解决方案 2

你抓住代码做了一些事情,不是吗?例如调用 log.error()。您可以验证特定调用确实发生过并且只发生过一次。我不记得使用 EasyMock 执行此操作的具体语法,但使用 Mockito 非常简单:使用 Mockito.verify().

解决方案 3 您可以使用 PowerMock 来检查是否调用了异常的构造函数。它不是很干净,因为理论上你可以创建异常实例但不要抛出它,但总比没有好。

也许您甚至可以组合这些解决方案。但是我相信第一个是最好的。

Do something 部分调用模拟抛出异常?

如果是,就expect(mock.methodCalled()).andThrow(new RejectedExecutionException());

然后 EasyMock.verify(mock) 在测试结束时。这将确保 methodCalled 被调用一次且仅调用一次。