EasyMock:java.lang.IllegalStateException:需要1个匹配器,记录了2个

EasyMock:java.lang.IllegalStateException:需要1个匹配器,记录了2个,java,easymock,matcher,Java,Easymock,Matcher,我在EasyMock 2.5.2和JUnit 4.8.2(通过Eclipse运行)方面遇到了问题。我已经阅读了这里所有类似的帖子,但没有找到答案。我有一个类,它包含两个测试相同方法的测试。我正在使用匹配器 单独运行时,每个测试都通过 第一个测试总是通过-如果我切换文件中测试的顺序,这是真的 以下是测试代码的简化版本: private Xthing mockXthing; private MainThing mainThing; @Before public void setUp() {

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

  • 单独运行时,每个测试都通过
  • 第一个测试总是通过-如果我切换文件中测试的顺序,这是真的
  • 以下是测试代码的简化版本:

    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
    
    对此有任何见解都将不胜感激

    谢谢,
    安妮

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

    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
    
    anyObject()
    是一个匹配器,您将在重播后调用它。它不用于生成任何对象。它用于指示EasyMock允许任何对象。EasyMock正在检测额外的匹配器,但在第二次测试之前,它不会有害。此时,EasyMock已记录但尚未使用的匹配器数量(2)与第二次
    doXthing
    调用的预期参数数量(1)不一致


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

    String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong()));
    
    有比
    anyObject()
    更精确的匹配器。这些允许您对协作者进行基于类型的断言

    来自:

    eq(X值)

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


    对我来说,这个失败(在我的例子中,预期有2个匹配器,记录了4个)意味着“您在同一个单元测试中混合了easymock和mockito,所以意外地调用了easymock的notNull()方法。这将导致失败,但仅当测试以特定顺序运行时才发生。

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

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

    哪一行抛出该异常?抱歉-在第二个(或最后一个)测试中-EasyMock.expect(mockXthing.doXthing((String)EasyMock.anyObject())).andReturn(xyz);好的,是的,我想这就是我当时的答案。你是对的!我不需要在你发布的行中使用匹配器。我可以传递真实的对象,甚至null(实际测试代码有4个参数)。非常感谢。我相信这也是我的情况。我尝试了马克的答案,但没有成功。测试仍然断断续续地失败。我将完全用Mockito重写测试。对我来说,我在断言中使用的是Easymock matcher而不是Hamcrest macther。尽管我已经按正确的顺序重置和重放了测试,但它记录了测试结果并导致了错误下一次考试不及格。这帮我找到了答案。