mockito test在运行junit test时没有给出这样的方法错误,但是当在运行配置中手动添加jar时,它运行良好

时间:2015-08-12 10:02:38

标签: java maven junit mockito powermock

我一直面临着一个特殊的问题。基本上,当我正常运行Mockito / PowerMockito测试时,即' Run as Junit Test',它会给我以下错误:

java.lang.NoSuchMethodError: org.mockito.mock.MockCreationSettings.isUsingConstructor()Z
at org.mockito.internal.creation.instance.InstantiatorProvider.getInstantiator(InstantiatorProvider.java:10)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:110)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:58)
at org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:203)
at org.powermock.api.extension.listener.AnnotationEnabler.standardInject(AnnotationEnabler.java:106)
at org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:54)
at org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:90)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:292)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

我曾尝试在maven依赖项和构建路径中添加所有必需的jar,但无济于事。

但是,我随后在运行配置 - > classpath->用户条目中手动添加了jar。然后,我像往常一样运行测试,它显示绿色状态栏,即它运行完美。

请帮我解决这个问题。我需要在没有这些令人讨厌的变化的情况下进行测试,这会影响我的工作。我能做什么才能正常运行测试,即不用一直运行配置,只需在构建路径中添加jar,然后运行为junit test'?

6 个答案:

答案 0 :(得分:37)

在日食屏幕上尝试Cntrl + Shift + T.检查你的结果是什么。理想情况下,eclipse只能从一个依赖项中解析此类。如果您获得多个结果,则可能需要在某些依赖项上添加排除项。

enter image description here

同时检查您是否能够从命令提示符执行测试用例。如果你能够做到,那么它不是一个maven问题。但如果此处出现问题,请检查您的依赖项。

答案 1 :(得分:14)

对我来说,mockito版本正在创造问题。如果您已在pom文件中明确添加,请删除mockito依赖项。我刚刚删除 -

testCompile 'org.mockito:mockito-all:1.9.5' 
从我的gradle文件中

行。让权力模拟解决并添加它自己需要的mockito依赖,而不是强行添加可能导致冲突的依赖。

所以对我来说依赖是 -

testCompile "org.powermock:powermock-module-junit4:1.6.4"
testCompile "org.powermock:powermock-module-junit4-rule:1.6.4" 
testCompile "org.powermock:powermock-api-mockito:1.6.4" 
testCompile "org.powermock:powermock-classloading-xstream:1.6.4" 

除了junit和其他lib依赖项之外你可能有。

答案 2 :(得分:1)

您的IDE需要与Maven同步,这是您通过添加依赖项手动执行的操作。

不幸的是,Eclipse没有(或者没有)提供开箱即用的这种行为(与IntelliJ无缝同步)。

过去使用Maven Eclipse Plugin解决方案,但查看文档似乎最新的方法是使用IDE的Eclipse Maven Integration插件。

答案 3 :(得分:0)

我认为mockito版本存在问题 - 我刚刚从 -

更新
testCompile group: 'org.mockito', name: 'mockito-all', version: '1.8.5' to  

testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'

答案 4 :(得分:0)

以防万一,我在IntelliJ中遇到了类似的问题。原则上,问题在于选择了不正确的嘲笑罐子。如何包含它以及如何删除它可能是特定于项目/ IDE的。我的问题和答案在这里-An exception or error caused a run to abort: org.mockito.internal.progress.ThreadSafeMockingProgress.mockingProgress()L

答案 5 :(得分:0)

其他答案为我提供了指导,但实际上引发问题的是我不小心输入了

import static org.mockito.ArgumentMatchers.eq;

其余代码使用时

import static org.mockito.Matchers.any;

你怎么了?

好吧,org.mockito.ArgumentMatchers是从Mockito 2.23中提取的,而org.mockito.Matchers(以及其余的模仿者导入)是从Mockito 1.9中导入的。

在版本2.23 Matchersextends ArgumentMatchers中(因此静态匹配器不再存在,它们在ArgumentMatchers类中),并标记为@Deprecated

无论如何,这触发了java.lang.NoSuchMethodError消息,解决方案是坚持使用1.9版本,只需使用

import static org.mockito.Matchers.eq;