【问题标题】:EasyMock: test that method in mock isn't calledEasyMock:在模拟中测试该方法不被调用
【发布时间】:2010-12-30 15:48:17
【问题描述】:

根据标题,只是想知道是否有一种带有 easymock 的机制来测试方法是否在其生命周期内未被调用。

【问题讨论】:

    标签: easymock


    【解决方案1】:

    我知道这个问题已经很老了,但我和 OP 有同样的问题,并做了更多的环顾四周。我找到了以下解决方案:

    通过在 EasyMock 声明的末尾添加 .andThrow(new AssertionFailedError()).anyTimes(); ,调用模拟方法时测试将失败。

    这比简单地不使用 NiceMock 并因为未模拟的方法调用而让测试失败要好,因为这允许您专门测试在给定场景中未调用 XYZ 方法。

    我想感谢大卫华莱士的回答。我在他对以下帖子的回答中找到了这个解决方案:Test that void method didn't get called with EasyMock

    【讨论】:

    • 我相信这应该是公认的答案。原因是单元测试经常随着新的需求而改变,很容易错过为什么没有设置模拟期望。此解决方案使缺少的方法调用显式化,因此需要更改代码的人更多的关注。
    • 您可能希望将.andThrow(new AssertionFailedError()).anyTimes(); 替换为不那么冗长的andStubThrow(new AssertionFailedError());
    【解决方案2】:

    来自 EasyMock documentation

    漂亮的模拟

    在 mock() 返回的 Mock 对象上,所有方法的默认行为是为所有意外的方法调用抛出 AssertionError。如果您想要一个默认允许所有方法调用并返回适当的空值(0、null 或 false)的“漂亮”模拟对象,请改用 niceMock()。

    所以你问的是默认行为。

    【讨论】:

    • 我发现默认行为很烦人,因为您很容易在测试中“要求”被测代码效率低下。我曾经做过一个简单的重构,将 getSomething() 调用移到循环之外,这导致测试失败,因为我没有调用 getSomething 40 次(!),并且“非好的”模拟鼓励这种类型的测试(因为它如果我希望在重构之前只调用一次,将会失败)。
    • @Stein:同意。单元测试应该是细粒度的,理想情况下只测试一件事。 “不好”的嘲笑不鼓励这样做。
    • 根据我对问题的阅读,OP 想要一个如果被调用则验证失败的模拟。漂亮的模拟不是 OP 想要的,因为在测试期间调用漂亮的模拟时,它仍然可以通过验证。
    【解决方案3】:

    默认情况下,Easymock 将为您未明确设置期望的任何被调用方法抛出异常。

    【讨论】:

      【解决方案4】:

      这对我有用:

      eastMockObject.method(arg); EasyMock.expectLastCall().andStubThrow(new AssertionError());

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多