Java 多次调用mock后出现Hamcrests NoSuchMethodError
我遇到了org.hamcrest.Matcher.descripebematch的NoSuchMethodError的常见问题。这很奇怪,因为当我试图在一个测试中模拟一个具有多个参数的方法时,它只是抛出。我想我的描述可能不清楚,所以我将用例子来说明。这是我的嘲弄:Java 多次调用mock后出现Hamcrests NoSuchMethodError,java,unit-testing,junit,mockito,hamcrest,Java,Unit Testing,Junit,Mockito,Hamcrest,我遇到了org.hamcrest.Matcher.descripebematch的NoSuchMethodError的常见问题。这很奇怪,因为当我试图在一个测试中模拟一个具有多个参数的方法时,它只是抛出。我想我的描述可能不清楚,所以我将用例子来说明。这是我的嘲弄: private void mockParameterListOfTerminalGroup(TerminalGroup terminalGroup, List<Parameter> parameters) {
private void mockParameterListOfTerminalGroup(TerminalGroup terminalGroup, List<Parameter> parameters) {
Matcher<ParameterFilter> matcher = Matchers.<ParameterFilter> hasProperty("bean", hasProperty("scopeId", equalTo(terminalGroup.getId())));
when(parameterDAO.getByExample(argThat(matcher))).thenReturn(parameters);
}
private void mockParameterListOfTerminalGroup(TerminalGroup TerminalGroup,列表参数){
Matcher Matcher=Matchers.hasProperty(“bean”、hasProperty(“scopeId”、equalTo(terminalGroup.getId()));
when(parameterDAO.getByExample(argThat(matcher))。然后返回(parameters);
}
当它在测试中被调用一次时,它工作得很清楚,但当我尝试为不同的参数多次模拟它时,它会出错
依赖项的顺序正确:
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>hamcrest-core</artifactId>
<groupId>org.hamcrest</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
org.hamcrest
汉克雷斯特岩芯
1.3
测试
org.hamcrest
汉克雷斯特图书馆
1.3
测试
org.mockito
莫基托磁芯
1.10.19
测试
汉克雷斯特岩芯
org.hamcrest
朱尼特
朱尼特
4.11
测试
有趣的是,当我用测试构建整个项目时,这个测试通过了,但当我将它作为一个junit测试运行时,它失败了 hasProperty(“scopeId”,equalTo(terminalGroup.getId())将scopeId替换为Matcher.any,并且不要硬编码参数,而是使用ArgumentMatchers以获得更好的结果。是的,我正在尝试将此Matcher更改为ArgumentMatchers,但我有一些小问题。我真的不知道如何实现这一点,试着用谷歌:)谢谢你的建议,你能提供更多的内部信息吗。代码看起来完全有效。测试的输出是什么?在测试期间,哪个参数被传递到
parameterDAO.getByExample
?我怀疑它可能不匹配。尝试在将输入参数与现有匹配器匹配的最后一个断言之前再添加一个断言。类似于assertThat(argumentOfGetByExampleCall,matcher)代码>。这可能有助于理解问题。问题还可能在于,在maven运行期间,测试并不是孤立的。在这种情况下,如果您使用一些额外的框架进行测试,比如SpringTest(它加载自己的上下文并重用它,在某些情况下,在特定的运行后可能会导致脏上下文),可能会发生这种情况。确保您的测试是完全隔离的(例如spring测试确实有强制清除上下文的机制)hasProperty(“scopeId”,equalTo(terminalGroup.getId())将scopeId替换为Matcher.any,并且不要硬编码您的参数,而使用ArgumentMatchers来获得更好的结果。是的,我正在尝试将此Matcher更改为ArgumentMatchers,但是我有一些小问题。我真的不知道如何实现这一点,试着用谷歌:)谢谢你的建议,你能提供更多的内部信息吗。代码看起来完全有效。测试的输出是什么?在测试期间,哪个参数被传递到parameterDAO.getByExample
?我怀疑它可能不匹配。尝试在将输入参数与现有匹配器匹配的最后一个断言之前再添加一个断言。类似于assertThat(argumentOfGetByExampleCall,matcher)代码>。这可能有助于理解问题。问题还可能在于,在maven运行期间,测试并不是孤立的。在这种情况下,如果您使用一些额外的框架进行测试,比如SpringTest(它加载自己的上下文并重用它,在某些情况下,在特定的运行后可能会导致脏上下文),可能会发生这种情况。确保您的测试完全隔离(例如,spring测试确实有强制清除上下文的机制)