让 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:

为了指定要抛出的异常(更准确地说:Throwables),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"));

【讨论】:

如果有人发现这对他们不起作用...确保您使用 EasyMock.replay【参考方案2】:

您可以在简单的模拟中使用andThrow(Throwable throwable) 方法。检查documentation - 标题Working with Exceptions

例如

 expect(mock.voteForRemoval("Document"))
    .andThrow(new RuntimeException(), 4);

【讨论】:

以上是关于让 EasyMock 模拟对象抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mockito 从模拟中抛出已检查的异常

Mockito 如何模拟和断言抛出的异常?

简单模拟IOC容器:返回对象并能抛出异常

调用函数时模拟器抛出异常(android studio)

模拟接口没声明异常抛出异常

3.2 模拟面试