测试没有使用 EasyMock 调用 void 方法

Posted

技术标签:

【中文标题】测试没有使用 EasyMock 调用 void 方法【英文标题】:Test that void method didn't get called with EasyMock 【发布时间】:2011-04-12 06:17:45 【问题描述】:

这可能吗? 我尝试使用EasyMock.expectLastCall().times(0);,但 EasyMock 抱怨时间必须 >=1

【问题讨论】:

见***.com/questions/859031/easymock-void-methods,但不确定它是不是骗子。 不是重复的。 【参考方案1】:

您可以使用.andThrow(new AssertionFailedError()).anyTimes(); - 这与Assert.fail() 抛出的异常相同,但比创建Answer 更简洁。

【讨论】:

也许添加一个关于测试失败原因的很好的描述进一步改进了这个解决方案(这是 IMO 给出的最好的解决方案)。【参考方案2】:

使用 easymock 3.0,您需要在 expectLastCall 上添加 .anyTimes() 否则测试将失败:

Expectation failure on verify: myMethod(): expected: 1, actual: 0`

基于 nkr1pt 示例:

expectLastCall().andAnswer(new IAnswer() 
    public Object answer() 
      Assert.assertFail();
      return null;
    
).anyTimes();

【讨论】:

我认为:Assert.assertFail();应该只是: Assert.fail(); 虽然这是一个可行的答案,但我更喜欢 David Wallace 的答案,因为它不那么冗长。【参考方案3】:

某些方法未被调用的事实由MockStrictMock 控制。当调用未记录的方法时,它们将引发异常。仅在使用NiceMocks 时才会出现此问题,其中调用未记录的方法时会返回默认值。

所以一个解决方案可以是不使用NiceMocks

【讨论】:

我非常不同意这个结论。也许,在这种情况下,nice mock 不是最好的选择。但是如果你想确保一个方法不会被调用,事实上这是你想要测试的唯一东西,最好用一个失败的模拟方法来强调这一点。 这是一个很好的论据。我想指出这一点,因为我偶然发现了为什么我不能指定times(0)。直到后来我才意识到,这与 nice mocking 的想法相矛盾,而 not nice mocking 不允许执行未记录的方法。抛出一个断言异常作为答案对我来说更像是一种解决方法,并且应该使用不好的模拟来指定 0 方法调用。也许我在结论中有点自信。我会纠正它。【参考方案4】:

对我来说似乎是一个错误。内部类Range 不允许设置小于 1 的最大值。

你不能模拟那个方法,然后调用Assert.fail() 吗?

【讨论】:

【参考方案5】:

如果您希望您的方法不会被调用,那么就不要记录它。但我同意它不适用于漂亮的模拟。

【讨论】:

【参考方案6】:

我想出了一个解决方案:

expectLastCall().andAnswer(new IAnswer() 
    public Object answer() 
        Assert.assertFail();
        return null;
    
);

【讨论】:

同意这行不通。正确答案来自 David Nguyen。

以上是关于测试没有使用 EasyMock 调用 void 方法的主要内容,如果未能解决你的问题,请参考以下文章

带有 void 方法的 EasyMock 期望

使用easymock,重复void方法调用

Powermock(使用 Easymock)没有最后一次调用模拟可用

EasyMock:无效方法

JUnit Easymock 意外的方法调用

Easymock:如何在不可见的情况下模拟受保护方法的调用