【问题标题】:Getting EasyMock mock objects to throw Exceptions让 EasyMock 模拟对象抛出异常
【发布时间】:2011-06-28 23:47:06
【问题描述】:

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

目前,我的测试仅包含所有内容都很复杂且远程服务器已启动并运行并按预期返回 XML 的场景。但是,如果我可以模拟 Foo 以便模拟远程服务器关闭时会发生什么,或者还有其他一些问题导致 IOException 被 @ 抛出,我更高兴987654325@.

我查看了 EasyMock API,但看不到任何看起来像要求模拟抛出异常的方法的东西。

对我来说,基于 Exception 的测试并不是绝对必要的,但我很好奇 EasyMock 是否可能,我认为以这种方式测试 Foo 的公共合约会很有用。

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

参考文献

【问题讨论】:

    标签: java unit-testing easymock


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多