【问题标题】:How to mock a file with EasyMock?如何使用 EasyMock 模拟文件?
【发布时间】:2010-04-22 01:24:32
【问题描述】:

我最近被介绍给 EasyMock,并被要求为使用它的 FileMonitor 类开发一些单元测试。 FileMonitor 类基于一个定时事件,该事件唤醒并检查定义的文件和目录列表中的文件修改。我知道如何使用实际的文件系统执行此操作,编写一个写入文件的测试并让 FileMonitor 完成它的工作。那么,我如何使用 EasyMock 做到这一点?我只是不明白如何让 EasyMock 模拟文件系统。

谢谢, 托德

【问题讨论】:

    标签: java filesystems mocking easymock


    【解决方案1】:

    类似的东西:

    import static org.easymock.classextension.EasyMock.*;
    
    File testDir = createMock(File.class);
    expect(testDir.lastModified()).andReturn(10L);
    // more expectations
    replay(testDir);
    // create a FileMonitor watching testDir
    // run the method which gets invoked by the trigger     
    verify(testDir);
    

    【讨论】:

    • 这看起来像我要找的。在发表更多评论之前,我需要先玩一下。感谢您的出色指导。
    • 看来我需要为 File 创建某种接口,因为 EasyMock 需要一个接口类型来模拟一个类。会告诉你进展如何。
    • 好的,回到我原来的位置。由于我只是在模拟一个接口,我如何“写入”到被模拟的对象,它不再是 File 类型,而是接口的类型?
    • @Todd EasyMock 类扩展(注意导入)可以模拟实际类。我发布的代码来自我编写的实际测试。
    • @binil,对不起,错过了。我们这里没有类扩展。我会看看我们是否被允许使用它。同时,我会为自己得到它。再次感谢。
    【解决方案2】:

    看看优秀(简洁)的user guide。不过,您可能会重新考虑使用 EasyMock - 大多数人目前正在使用或正在切换到更高级和更积极开发的Mockito(受 EasyMock 启发)。

    【讨论】:

    • 感谢您的提示。不幸的是,我别无选择,这是公司选择的。至于手册,我在问问题之前确实通读了它,猜想我错过了关于文件系统的部分。
    【解决方案3】:

    模拟的基本技术是引入一个接口(如果当前设计没有),该接口为被模拟的真实服务(依赖项)提供方法。该测试正在测试被测类是否与依赖项正确交互。正确的意思是它做你期望它做的事情。这并不意味着它做了正确的事情,因为正确的事情只能通过使用真实组件的集成测试来确定(您设想通过创建真实文件来做什么)。

    所以你需要在被测类上有一个方法,让你传入这个接口的实现。最明显的是通过构造函数。你有生产构造函数,它使用接口的真实实现来初始化类,该接口的实际实现命中真实文件系统,然后在测试中你将模拟传递给构造函数。

    在测试中,您在类上运行方法并断言接口以您期望的方式调用。

    我会注意到,在创建类之后通过模拟进行单元测试的价值有限,但它有助于锁定行为,以便未来对类的更改不会以令人惊讶的方式打破预期。

    我希望这可以帮助您入门。

    一些模拟框架支持模拟实际的具体类,这在 test-after 单元测试中很有意义(通过拦截对真实类的调用而不仅仅是接口)。我找不到 EasyMock 是否允许您这样做,但如果您需要这种功能,JDave 可能是您可以去的地方。它甚至可以让你模拟期末课程。

    【讨论】:

      【解决方案4】:

      我会将对文件系统的实际调用放在其单独的包私有方法中。对于测试,扩展类并覆盖该方法。因此,您实际上并没有调用文件系统。

      EasyMocks 类扩展也可以创建部分模拟,但我并不完全相信这一点。

      http://easymock.org/EasyMock2_4_ClassExtension_Documentation.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多