记录的匹配器比预期的多-Easymock失败是Maven失败,不是Eclipse失败

|| Easymock 3.0和JUnit 4.8.2出现了一个奇怪的问题。 仅当从Maven执行测试而不是从Eclipse执行测试时,才会出现此问题。 这是单元测试(非常简单):
...
protected ValueExtractorRetriever mockedRetriever;
...

@Before
public void before() {
    mockedRetriever = createStrictMock(ValueExtractorRetriever.class);
}

@After
public void after() {
    reset(mockedRetriever);
}

@Test
public void testNullValueExtractor() { 
    expect(mockedRetriever.retrieve(\"PROP\")).andReturn(null).once();
    replay(mockedRetriever);

    ValueExtractor retriever = mockedRetriever.retrieve(\"PROP\");
    assertNull(retriever);

    assertTrue(true);
}
我得到:   java.lang.IllegalStateException:预期有1个匹配器,已记录2个。 奇怪的是,我什至没有使用参数匹配器。那是测试的唯一方法!更糟糕的是,它在Eclipse中可以运行,而在Maven中则无法运行! 我发现一些链接没有为我提供答案: 另一个StackOverflow帖子 JUnit中的预期异常 如果更改单元测试并添加另一种方法(确实使用了参数匹配器):
@Test
public void testIsBeforeDateOk() {
    expect(mockedRetriever.retrieve((String)anyObject())).andReturn(new PofExtractor()).anyTimes();
    replay(this.mockedRetriever);

    FilterBuilder fb = new FilterBuilder();
    assertNotNull(fb);

    CriteriaFilter cf = new CriteriaFilter();
    assertNotNull(cf);
    cf.getValues().add(\"2010-12-29T14:45:23\");
    cf.setType(CriteriaType.DATE);
    cf.setClause(Clause.IS_BEFORE_THE_DATE);

    CriteriaQueryClause clause = CriteriaQueryClause.fromValue(cf.getClause());
    assertNotNull(clause);
    assertEquals(CriteriaQueryClause.IS_BEFORE_THE_DATE, clause);

    clause.buildFilter(fb, cf, mockedRetriever);
    assertNotNull(fb);

    Filter[] filters = fb.getFilters();
    assertNotNull(filters);
    assertEquals(filters.length, 1);

    verify(mockedRetriever);

    logger.info(\"OK\");
}
最后一种方法通过了测试,但没有另一种通过。这怎么可能!?!?! 问候, 尼科 更多链接: \“ bartling.blogspot.com/2009/11/using-argument-matchers-in-easymock-and.html \” \“ www.springone2gx.com/blog/scott_leberknight/2008/09/the_n_matchers_expected_m_recorded_problem_in_easymock \” \“ stackoverflow.com/questions/4605997/3-matchers-expected-4-recorded \”     
已邀请:
我有一个非常类似的问题,并在下面的链接中写了我的发现。 http://www.flyingtomoon.com/2011/04/unclosed-record-state-problem-in.html(刚刚更新) 我认为该问题会影响您当前的测试。问题出在另一个测试类上,它会影响您的测试。为了找到真正的问题的位置,我建议逐个禁用有问题的测试,直到通知失败的测试为止。 其实这就是我所做的。我逐个禁用了失败的测试,直到发现有问题的测试。我发现了一个引发异常并通过\“ @ extected \”批注捕获而不停止记录的测试。     
我们最近遇到了这个问题,并且只有在运行整个测试套件(1100多个测试用例)时才抬起头来。最终,我发现我可以在正在爆炸的测试上放置一个断点,然后返回到Eclipse已经执行的测试列表中,查找先前错误地设置了模拟的测试用例。 原来我们的问题是有人在
EasyMock.expect(...)
语句之外使用了
EasyMock.anyString()
。果然,它在失败之前先进行了两次测试。 因此,从本质上讲,发生的事情是,在Expect语句之外滥用匹配器正在毒化EasyMock的状态,而下一次我们尝试创建模拟时,EasyMock将会崩溃。     
我相信第一条错误信息   java.lang.IllegalStateException:1   符合条件的匹配者,已记录2个。 表示您的
mockedRetriever
方法被调用了两次,但是测试期望它被调用了一次。因此,您的Eclipse和Maven \的配置有所不同。 而且我没有理由在测试后重设模拟。请记住,JUnit为每个测试方法都创建了新的类实例。 编辑: 最后一个测试方法通过答案的原因是:
expect(mockedRetriever.retrieve((String)anyObject())).andReturn(new PofExtractor()).anyTimes();
但是在您的第一个测试方法中是:
expect(mockedRetriever.retrieve(\"PROP\")).andReturn(null).once();
等同于:
expect(mockedRetriever.retrieve(\"PROP\")).andReturn(null);
    

要回复问题请先登录注册