EasyMock测试在代码中间抛出一个异常



我正在使用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部分调用mock抛出异常?

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

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

相关内容

最新更新