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

mockito test gives no such method error when run as junit test but when jars are added manually in run confugurations, it runs well

我遇到了一个特殊的问题。基本上,当我 运行 我的 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.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,但无济于事。

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

请帮我解决这个问题。我需要进行测试 运行,而不要进行这些会影响我工作的恼人更改。我该怎么做才能正常进行 运行 测试,即无需一直进行 运行 配置,只需在构建路径中添加 jars 然后 'run as junit test'?

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

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

该解决方案过去是通过 Maven Eclipse Plugin but looking at the docs it seems the latest way to do this is with Eclipse Maven Integration 插件为 IDE 完成的。

在您的 eclipse 屏幕上尝试 Cntrl + Shift + T。检查你的结果是什么。理想情况下,eclipse 应该只从一个依赖项中解决此 class。如果您得到多个结果,您可能需要添加对某些依赖项的排除。

还要检查您是否能够从命令提示符执行测试用例。如果您能够做到,那么这不是行家的问题。但如果这里出现问题,请检查您的依赖项。

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

testCompile 'org.mockito:mockito-all:1.9.5' 

我的 gradle 文件中的行。让 power mock 解决并添加它自己需要的 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 依赖项。

我认为 Mockito 版本有问题 - 我刚刚更新了代码 -

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

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

如果有帮助,我在 IntelliJ 中遇到了类似的问题。原则上,问题在于选择了不正确的 mockito jar。如何包含它以及如何删除它可能是 project/IDE 具体的。我的问题和答案在这里 - An exception or error caused a run to abort: org.mockito.internal.progress.ThreadSafeMockingProgress.mockingProgress()L

其他答案给了我指导,但真正引发问题的是我不小心导入了

import static org.mockito.ArgumentMatchers.eq;

其余代码使用时

import static org.mockito.Matchers.any;

你问什么问题?

好吧,org.mockito.ArgumentMatchers 取自 Mockito 2.23,org.mockito.Matchers(以及其余的 mockito 导入)取自 Mockito 1.9。

在版本 2.23 Matchers class extends ArgumentMatchers 中(因此静态匹配器不再存在,它们在 ArgumentMatchers class 中)和标记为 @Deprecated

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

import static org.mockito.Matchers.eq;