【问题标题】:EasyMock: isA() fails on the right classEasyMock:isA() 在正确的类上失败
【发布时间】:2016-09-22 15:56:59
【问题描述】:

我告诉模拟对象等待带有命令的方法: mockObject.registerSQLDriver(isA(SomeName.class));

在运行时方法被 SomeName 类的实例完全调用,但测试失败告诉“意外的方法调用 registerSQLDriver()”

什么会导致这个问题?

代码如下:

resetToDefault(_SQLDriverManager);
_SQLDriverManager.registerSQLDriver(isA(SQLDriver.class));
expectLastCall().anyTimes();
replay(_SQLDriverManager);

【问题讨论】:

  • 错误在第 73 行,或者 56 行,或者可能是 865 行。没有代码,很难说。也许你告诉你的模拟这个方法会被调用一次,而实际上它被调用了多次。
  • 错误消息显示“意外的方法调用 registerDriver()”。您嘲笑了“registerSQLDriver”方法。这些方法不同。
  • 错误消息准确地说明了 registerSQLDriver()。在我看来,这个问题不在 isA() 中。例如,我将其更改为 notNull(),它仍然失败。
  • 被测试代码使用的实际 SQLDriverManager 必须是另一个模拟而不是您配置的模拟。你确定你没有配置一个本地的_SQLDriverManager变量,而代码实际上使用了一个实例_SQLDriverManager变量?
  • 你是对的。后来我初始化了另一个 Mock 实例。谢谢

标签: java easymock


【解决方案1】:

您可能正在模拟一个实例并测试另一个实例。 要检查这一点,您应该在模拟创建中添加 name 参数:

Comparable<String> mock01 = EasyMock.createMock("M1", Comparable.class);
Comparable<String> mock02 = EasyMock.createMock("M2", Comparable.class);

EasyMock.expect(mock01.compareTo(EasyMock.isA(String.class))).andReturn(1);
EasyMock.replay(mock01, mock02);

mock02.compareTo("Test");

EasyMock.verify(mock01, mock02);

在这种情况下,测试将失败并显示以下消息:

意外的方法调用 M2.compareTo("Test")

代替:

意外的方法调用 Comparable.compareTo("Test")

【讨论】:

    最近更新 更多