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

时间:2011-07-01 15:34:08

标签: java easymock matcher

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

  1. 每次测试都在单独运行时通过。
  2. 第一个测试总是通过 - 如果我在文件中切换测试的顺序,则为真。
  3. 以下是测试代码的简化版本:

    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 个答案:

答案 0 :(得分:11)

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

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

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

您应该将真实参数传递给testCallingXthing(或处于重播模式的模拟)。尝试直接传递null或像2这样的实际值。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

尝试:

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

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

来自EasyMock documentation

  

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

答案 3 :(得分:0)

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

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