Java Powermock的问题

Java Powermock的问题,java,unit-testing,mockito,powermock,Java,Unit Testing,Mockito,Powermock,我试图在我的测试用例中使用Powermockito来测试遗留public final ClassToTest中的void delete() 例外情况如下: java.lang.NoClassDefFoundError: org/mockito/internal/creation/instance/InstantationException at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.cre

我试图在我的测试用例中使用Powermockito来测试遗留
public final ClassToTest
中的
void delete()

例外情况如下:

java.lang.NoClassDefFoundError: 

org/mockito/internal/creation/instance/InstantationException
    at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMethodInvocationControl(DefaultMockCreator.java:121)
    at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMock(DefaultMockCreator.java:69)
    at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock(DefaultMockCreator.java:46)
    at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:71)
    at nl.naturalis.nba.etl.ClassToTestTest.testLogDuration(ClassToTestTest.java:87)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
    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:298)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)
Caused by: java.lang.ClassNotFoundException: org.mockito.internal.creation.instance.InstantationException
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:202)
    at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass1(DeferSupportingClassLoader.java:89)
    at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:79)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 37 more
依赖项的My ivy.xml如下所示:

<dependency org="junit" name="junit" rev="4.11"/>
<dependency org="org.mockito" name="mockito-all" rev="1.9.5"/>
<dependency org="org.powermock" name="powermock-module-junit4" rev="1.7.3"/>
<dependency org="org.powermock" name="powermock-api-mockito" rev="1.7.3"/>
<dependency org="org.powermock" name="powermock-core" rev="1.7.3"/>
我进行了一次调试,以发现它在尝试加载此类时恰好在此时失败:

org.powermock.api.mockito.repackaged.ClassImposterizer

依赖项中是否有我遗漏的内容?或者我做错了什么

Mockito的1.9.5是一个非常旧的版本。你能试着用最新的稳定版本-1.10.19来改变它吗

org/mockito/internal/creation/instance/InstantationException
类已在mockito的2.x版本中引入,在1.9.5版本中不可用


同样基于兼容性表,您应该将Powermock 1.5.6版本作为支持1.9.5 Mockito的最新版本

尝试在intellij Idea依赖项分析器插件中使用并解决冲突,这看起来像是依赖项冲突。
PS将mockito更新到最新的2.*版本,我做到了,没有冲突或问题,新版本非常好

您是否尝试过使用1.7.1版,就像中指定的那样?我刚才也犯了同样的错误。我使用的是Ubuntu操作系统,这与此有关吗?我刚刚看到有人在他们的ubuntu系统中遇到了Mockito问题。我确实将我的Mockito版本更新为2.0.2-beta,这个异常消失了,但现在得到了这个错误017-12-08 11:43:36192主要错误无法重新配置JMX java.lang.LinkageError:loader约束冲突:loader(org/powermock/core/classloader/MockClassLoader的实例)以前启动了名为“javax/management/MBeanServer”的不同类型的加载。为了使用最新的powermock Library,您需要更新到至少2.8.0。我的意思是,我将我的ivy.xml更新为此
。你能告诉我你指的是哪一个特定的依赖关系吗?有趣的是我的junit测试现在通过了,但我最终还是得到了这个错误:
2017-12-08 11:53:39897 pool-1-thread-1错误无法注销MBeans java.lang.LinkageError:org.apache.logging.log4j.core.jmx.Server.unregisterAllMatching上的javax/management/MBeanServer(Server.java:335)
即使我的类中有这个注释
@PowerMockIgnore(“javax.management.*”)
我建议使用mockito core依赖项而不是mockito allI。我确实将我的mockito版本更新为2.0.2-beta版,但此异常已消失,但现在出现以下错误:错误无法重新配置JMX java.lang.LinkageError:加载程序约束冲突:加载程序(org/powermock/core/classloader/MockClassLoader的实例)之前启动了名为“javax/management/MBeanServer”的不同类型的加载mockito的最新版本是2.13.0不要在应用程序中使用beta/snapshot版本,多亏Igor,我已经将该版本更新为2.13.0。
org.powermock.api.mockito.repackaged.ClassImposterizer