记录的Matchers比预期更多--Endymock从Maven而不是Eclipse中失败

Nic*_*ico 6 java eclipse junit easymock maven

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

我得到:

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

奇怪的是,我甚至没有使用参数匹配器.这是测试的唯一方法!并且使它变得更糟,它可以从Eclipse运行并且从Maven中失败!

我发现了一些没有给我答案的链接:

如果我更改单元测试并添加一个方法(使用参数匹配器):

@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");
}
Run Code Online (Sandbox Code Playgroud)

最后一种方法通过了测试而不是另一种方法.这怎么可能!?!?!

此致,尼科

更多链接:

"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"

lem*_*han 5

我有一个非常相似的问题,并在下面的链接中写了我的发现. http://www.flyingtomoon.com/2011/04/unclosed-record-state-problem-in.html(刚刚更新)

我相信另一个影响您当前测试的测试中的问题.问题出在另一个测试类上,它会影响你的测试.为了找到真正问题的位置,我建议逐个禁用有问题的测试,直到你通知失败的测试.

实际上这就是我所做的.我一个接一个地禁用了失败的测试,直到找到有问题的测试.我发现了一个抛出异常的测试,并通过"@extected"注释捕获而不停止录制.