EasyMock:java.lang.IllegalStateException:1匹配预期,2记录

Ann*_*nne 16 java easymock matcher

我遇到了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);
}
Run Code Online (Sandbox Code Playgroud)

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

java.lang.IllegalStateException: 1 matchers expected, 2 recorded
Run Code Online (Sandbox Code Playgroud)

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

谢谢,安妮

Mar*_*ers 11

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

String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
Run Code Online (Sandbox Code Playgroud)

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

您应该将实际参数传递给testCallingXthing(或处于重放模式的模拟).尝试null直接传递,或者像真正的值一样2.


rog*_*ack 5

对我来说,这个失败(在我的例子中预期有 2 个匹配器,记录了 4 个。)意味着“您在同一个单元测试中混合了 easymock 和mockito,因此意外地为mockito 参数调用了 easymock 的 notNull() 方法。这会导致失败,但前提是测试按一定顺序运行。