EasyMock测试异常是在代码中间抛出的

时间:2017-01-04 07:00:20

标签: java exception easymock

我正在使用EasyMock编写测试,并且有一段这样的源代码:

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

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

2 个答案:

答案 0 :(得分:1)

我认为你没有一个干净的方法来处理任何模型框架。但是我可以建议你以下解决方案。

解决方案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检查是否调用了异常的构造函数。它不是很干净,因为理论上你可以创建异常实例但不抛出它,但它总比没有好。

您甚至可以将这些解决方案结合起来。但我相信第一个是最好的。

答案 1 :(得分:0)

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

如果是,请执行expect(mock.methodCalled()).andThrow(new RejectedExecutionException());

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