让 EasyMock 模拟对象抛出异常

23

我正在使用EasyMock编写一些协作类的单元测试。其中一个类(我们称之为Foo)会打开一个到远程服务器的网络连接,并将该服务器的XML响应解析成其他类可以使用的内容。

目前,我的测试只包括一切顺利的情况,即远程服务器正在运行,并返回预期的XML。但是,如果我能够模拟Foo以模拟远程服务器宕机或出现其他问题导致IOExceptionFoo抛出,那么我会更加高兴。

我已经查看了EasyMock API,但没有看到任何看起来像是要求模拟对象抛出异常的方法。

虽然对于我来说没有绝对必要进行基于Exception的测试,但我很好奇是否可以在EasyMock中实现,并且我认为以这种方式测试Foo的公共约定会很有用。

有人以前使用过EasyMock做过类似的事情吗?

参考资料

2个回答

29

根据文档

要指定要抛出的异常(更确切地说是Throwable),由expectLastCall()expect(T value)返回的对象提供了方法andThrow(Throwable throwable)。该方法必须在记录状态下调用,用于指定它所适用的模拟对象的Throwable

未经检查的异常(即RuntimeExceptionError及其所有子类)可以从每个方法中抛出。只有实际上会抛出它们的方法才能抛出已检查的异常。

例如:

expectLastCall().andThrow(new HibernateException("Something terrible happened"));

expect(query.list()).andThrow(
        new HibernateException("Something terrible happened"));

2
如果有人发现这个不起作用...请确保使用EasyMock.replay。 - irl_irl

5
你可以在 Easy Mock 中使用 andThrow(Throwable throwable) 方法。请参考文档中的 “Working with Exceptions” 章节。
例如:
 expect(mock.voteForRemoval("Document"))
    .andThrow(new RuntimeException(), 4);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接