让 EasyMock 模拟对象抛出异常
Posted
技术标签:
【中文标题】让 EasyMock 模拟对象抛出异常【英文标题】:Getting EasyMock mock objects to throw Exceptions 【发布时间】:2011-06-28 23:47:06 【问题描述】:我正在使用 EasyMock 为许多协作类编写单元测试。其中一个类(我们称之为Foo
)打开一个到远程服务器的网络连接,并将服务器的XML 响应解析为其他类可以使用的东西。
目前,我的测试仅包含所有内容都很复杂且远程服务器已启动并运行并按预期返回 XML 的场景。但是,如果我可以模拟 Foo
以便模拟远程服务器关闭时会发生什么,或者还有其他一些问题导致 IOException
被 @ 抛出,我会更高兴987654325@.
我查看了 EasyMock API,但看不到任何看起来像要求模拟抛出异常的方法的东西。
对我来说,基于 Exception
的测试并不是绝对必要的,但我很好奇 EasyMock 是否可能,我认为以这种方式测试 Foo
的公共合约会很有用。
以前有人用 EasyMock 做过类似的事情吗?
参考文献
EasyMock API【问题讨论】:
【参考方案1】:来自documentation:
为了指定要抛出的异常(更准确地说:
Throwable
s),expectLastCall()
和expect(T value)
返回的对象提供了方法andThrow(Throwable throwable)
。该方法必须在调用它指定要抛出的Throwable
的模拟对象之后以记录状态调用。每个方法都可以抛出未经检查的异常(即
RuntimeException
、Error
及其所有子类)。已检查的异常只能从实际抛出它们的方法中抛出。
例如:
expectLastCall().andThrow(new HibernateException("Something terrible happened"));
expect(query.list()).andThrow(
new HibernateException("Something terrible happened"));
【讨论】:
如果有人发现这对他们不起作用...确保您使用 EasyMock.replay【参考方案2】:您可以在简单的模拟中使用andThrow(Throwable throwable)
方法。检查documentation - 标题Working with Exceptions。
例如
expect(mock.voteForRemoval("Document"))
.andThrow(new RuntimeException(), 4);
【讨论】:
以上是关于让 EasyMock 模拟对象抛出异常的主要内容,如果未能解决你的问题,请参考以下文章