记录的匹配器比预期的多-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 \”
没有找到相关结果
已邀请:
3 个回复
功飘
死搭胯
语句之外使用了
。果然,它在失败之前先进行了两次测试。 因此,从本质上讲,发生的事情是,在Expect语句之外滥用匹配器正在毒化EasyMock的状态,而下一次我们尝试创建模拟时,EasyMock将会崩溃。
队辅坟阮阶
方法被调用了两次,但是测试期望它被调用了一次。因此,您的Eclipse和Maven \的配置有所不同。 而且我没有理由在测试后重设模拟。请记住,JUnit为每个测试方法都创建了新的类实例。 编辑: 最后一个测试方法通过答案的原因是:
但是在您的第一个测试方法中是:
等同于: