我正在使用EasyMock为许多协作类编写单元测试。其中一个类(让我们称之为Foo
)打开与远程服务器的网络连接,并将该服务器的XML响应解析为其他类可以使用的内容。
目前,我的测试仅包含一切都很糟糕且远程服务器启动并运行并按预期返回XML的场景。但是,如果我可以模拟Foo
,我会更高兴,这样我就可以模拟远程服务器关闭时会发生什么,或者还有其他问题会导致IOException
被Foo
抛出。
我看过EasyMock API,我看不到任何看起来像是要求模拟抛出异常的方法。
对于我来说,进行基于Exception
的测试并不是绝对必要的,但我很好奇是否可以使用EasyMock,我认为以这种方式测试Foo
的公共合同会很有用。
之前有人用EasyMock做过这样的事吗?
参考
答案 0 :(得分:28)
为了指定要抛出的异常(更确切地说:
Throwable
s),expectLastCall()
和expect(T value)
返回的对象提供方法andThrow(Throwable throwable)
。在调用Mock对象之后,必须在记录状态下调用该方法,并为其指定要抛出的Throwable
。可以从每个方法抛出未经检查的异常(即
RuntimeException
,Error
及其所有子类)。只能从实际抛出它们的方法中抛出已检查的异常。
例如:
expectLastCall().andThrow(new HibernateException("Something terrible happened"));
expect(query.list()).andThrow(
new HibernateException("Something terrible happened"));
答案 1 :(得分:4)
您可以在简单模拟中使用方法andThrow(Throwable throwable)
。查看documentation - 标题使用例外。
例如
expect(mock.voteForRemoval("Document"))
.andThrow(new RuntimeException(), 4);