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

Java 记录的匹配器比预期的多-Easymock从Maven而不是Eclipse失败,java,eclipse,maven,junit,easymock,Java,Eclipse,Maven,Junit,Easymock,我对Easymock 3.0和JUnit 4.8.2有一个奇怪的问题。 该问题仅在从Maven而不是Eclipse执行测试时发生 这是单元测试(非常简单): 我得到: java.lang.IllegalStateException:需要1个匹配器,记录了2个 奇怪的是,我甚至没有使用参数匹配器。这是唯一的测试方法!更糟糕的是,它在Eclipse中工作,在Maven中失败 我发现了一些没有给我答案的链接: 如果我更改单元测试并添加另一个方法(使用参数匹配器): 最后一种方法通过了测试,但另

我对Easymock 3.0和JUnit 4.8.2有一个奇怪的问题。 该问题仅在从Maven而不是Eclipse执行测试时发生

这是单元测试(非常简单):

我得到:

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

奇怪的是,我甚至没有使用参数匹配器。这是唯一的测试方法!更糟糕的是,它在Eclipse中工作,在Maven中失败

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

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

最后一种方法通过了测试,但另一种方法没有通过。这怎么可能

问候,, 尼科

更多链接:

“bartling.blogspot.com/2009/11/在easymock和.html中使用参数匹配器”

“www.springone2gx.com/blog/scott\u leberknight/2008/09/the\u n\u matchers\u expected\u m\u recorded\u problem\u in\u easymock”


“stackoverflow.com/questions/4605997/3-matchers-expected-4-recorded”

我相信第一条错误消息

java.lang.IllegalStateException:1 预计有两名匹配者,记录在案

表示您的
mockedRetriever
方法调用了两次,但测试预期调用了一次。因此,Eclipse和Maven的配置不同

我没有理由在测试后重置mock。请记住,JUnit会为每个测试方法创建新的类实例

编辑:

最后一种测试方法通过的原因是:

expect(mockedRetriever.retrieve((String)anyObject())).andReturn(new PofExtractor()).anyTimes();
但在您的第一个测试方法中,它是:

expect(mockedRetriever.retrieve("PROP")).andReturn(null).once();
相当于:

expect(mockedRetriever.retrieve("PROP")).andReturn(null);

我有一个非常类似的问题,并将我的发现写在下面的链接中。 (刚刚更新)

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


事实上我就是这么做的。我一个接一个地禁用了失败的测试,直到发现有问题的测试。我发现一个测试抛出一个异常,并在不停止录制的情况下捕获“@extexted”注释。

我们最近遇到了这个问题,只有在我们运行整个测试套件(1100多个测试用例)时,它才出现问题。最终,我发现我可以在即将崩溃的测试上设置一个断点,然后返回Eclipse已经执行的测试列表,查找之前错误设置模拟的测试用例

我们的问题是有人在
EasyMock.expect(…)
语句之外使用了
EasyMock.anyString()
。果不其然,在一次失败之前,它做了两次测试


因此,本质上,在expect语句之外滥用匹配器正在毒害EasyMock的状态,下一次我们尝试创建模拟时,EasyMock会崩溃。

您使用的是m2eclipse吗?你的pom看起来怎么样?我是。不幸的是,pom非常大,因为这是许多测试中的一个测试,这些测试可以从许多maven模块中的一个工作(这使得这更奇怪)。最奇怪的是,如果我启用maven surefire报告并并行运行线程,它就会工作!但这取决于环境(Hudson失败,但它在我的开发环境中工作)。您是否删除了完整的本地maven存储库,并在开发环境中从头开始测试了它?我尝试过,我也遇到了同样的问题!这真奇怪!因为它只发生在一些测试中。。。还有其他想法吗?@Constantiner 1->
mockedRetriever
只被调用一次,正如您在方法中看到的那样:
testNullValueExtractor
。我看不到哪里记录了2个“行为”。。。2->重置存在,因为最初我有多个测试,我重用了同一个模拟,老实说,我不知道实例化了多个实例。很高兴知道!我不明白你说什么。问题是,如果我只保留(并删除另一个)方法:
testIsBeforeDateOk
它会失败!!这就是问题所在!!!!4->最后,Maven创建了我的eclipse项目,而不是我。啊,对不起!我并没有注意到在您的第一个代码中并没有测试中的类,您只是直接调用mock对象。如果添加
verify(mockedRetriever)会怎么样
在第一个代码示例中的
testNullValueExtractor()
方法的末尾?@Constantiner我添加了它,但它仍然在“记录模式”下失败。我很确定这不是测试本身的问题,而是其他方面的问题。我将尝试禁用其他测试,看看这是否有效,因为这实际上没有任何意义,是吗?当然,调试单个测试要比同时调试大量测试简单得多。@Constantiner->我终于找到了它!正如奥图兹别斯利在回答中提到的那样,这是一个问题。非常感谢!!!>太多了!!!我禁用了我所有的测试,并通过了所有的测试,直到我找到了一个这样的测试,这也导致我进入了另一个错误的测试类,我修复了它,现在一切正常。更新帖子的Thx:)这正是我遇到的。调用PowerMockito.when需要使用Matcher.anyString()和EasyMock.expect需要使用EasyMock.anyString()。两者都需要的原因是PowerMockito允许模拟静态。
expect(mockedRetriever.retrieve("PROP")).andReturn(null).once();
expect(mockedRetriever.retrieve("PROP")).andReturn(null);