如何解决记录的匹配器比预期的多-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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。