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
被调用一次且仅调用一次。
我正在用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
被调用一次且仅调用一次。