【问题标题】:EasyMock : java.lang.IllegalStateException: 1 matchers expected, 2 recordedEasyMock:java.lang.IllegalStateException:预期 1 个匹配器,记录 2 个
【发布时间】:2011-09-26 20:39:51
【问题描述】:

我在使用 EasyMock 2.5.2 和 JUnit 4.8.2(通过 Eclipse 运行)时遇到问题。我在这里阅读了所有类似的帖子,但没有找到答案。我有一个包含两个测试相同方法的测试的类。我正在使用匹配器。

  1. 单独运行时,每个测试都会通过。
  2. 第一个测试总是通过 - 如果我切换文件中测试的顺序,这是真的。

下面是简化版的测试代码:

private Xthing mockXthing;
private MainThing mainThing;

@Before
public void setUp() {
    mockXthing = EasyMock.createMock(Xthing.class);
    mainThing = new MainThing();
    mainThing.setxThing(mockXthing);
}

@After
public void cleanUp() {
    EasyMock.reset(mockXthing);
}

@Test
public void testTwo() {
    String abc = "abc";
    EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(abc);
    EasyMock.replay(mockXthing);
    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
    assertEquals("abc", testResult);
    EasyMock.verify(mockXthing);
}

@Test
public void testOne() {
    String xyz = "xyz";
    EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz);
    EasyMock.replay(mockXthing);
    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
    assertEquals("xyz", testResult);
    EasyMock.verify(mockXthing);
}

第二个(或最后一个)测试总是失败并出现以下错误:

java.lang.IllegalStateException: 1 matchers expected, 2 recorded

对此的任何见解将不胜感激。

谢谢, 安妮

【问题讨论】:

  • 哪一行抛出异常?
  • 抱歉 - 在第二个(或最后一个)测试中 -EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz);
  • 好吧,我想这就是我的回答。

标签: java easymock matcher


【解决方案1】:

我还没有仔细仔细看,但这看起来很可疑:

String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());

anyObject() 是一个匹配器,您在重放之后 调用它。它不用于生成任何对象。它用于指示 EasyMock 允许任何对象。 EasyMock 正在检测那个额外的匹配器,但它直到第二次测试才有害。此时,EasyMock 已记录但尚未使用的匹配器数量 (2) 与第二次 doXthing 调用 (1) 的预期参数数量不一致。

您应该将 real 参数传递给testCallingXthing(或处于回放模式的模拟)。尝试直接传入null,或者像2这样的真实值。

【讨论】:

  • 你是对的!我不需要在您发布的行中使用匹配器。我可以只传递真实的对象甚至 null(真实的测试代码有 4 个参数)。非常感谢。
【解决方案2】:

对我来说,这个失败(在我的情况下,预计有 2 个匹配器,记录了 4 个。)意味着“你在同一个单元测试中混合了 easymock 和 mockito,所以不小心调用了 easymock 的 notNull() 方法来获取 mockito 参数。这会导致失败但前提是测试按特定顺序运行。

【讨论】:

  • 我相信这也是我的情况。我尝试了马克的答案,但没有奏效。测试仍然间歇性地失败。我将纯粹在 Mockito 中重写测试。
  • 对我来说,我在断言中使用了 Easymock 匹配器而不是 Hamcrest macther。即使我以正确的顺序重置和重播,它仍在记录它们并导致下一次测试失败。这帮助我找到了它。
【解决方案3】:

试试:

String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));

有比anyObject() 更精细的匹配器。这些允许您对协作者进行基于类型的断言。

来自EasyMock documentation

eq(X value)
如果实际值等于预期值,则匹配。可用于所有基本类型和对象。
anyBoolean()anyByte()anyChar()anyDouble()anyFloat()anyInt()anyLong()anyObject()anyShort()

【讨论】:

    【解决方案4】:

    您应该在每个测试方法之后重置模拟以摆脱这个问题。添加以下代码将解决此问题。

    @After 
    public void after(){
        EasyMock.reset(mockXthing)
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多