23

我在使用 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

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

谢谢,安妮

4

4 回答 4

18

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

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

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

您应该将真实参数传递给testCallingXthing(或处于重播模式的模拟)。尝试null直接传入,或者像2.

于 2011-07-01T15:48:38.450 回答
4

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

于 2013-06-27T18:00:02.053 回答
2

尝试:

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

有比anyObject(). 这些允许您对协作者进行基于类型的断言。

来自EasyMock 文档

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

于 2011-07-01T15:54:23.473 回答
0

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

@After 
public void after(){
    EasyMock.reset(mockXthing)
}
于 2015-08-05T06:49:26.823 回答