Mockito 测试不适用于提交者的 Eclipse 4.9
Mockito tests doesn't work with Eclipse 4.9 for commiters
每当我尝试 运行 Mockito 测试时,Eclipse 都会给出以下输出:
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.InstantiatorProvider2 (alternate: interface org.mockito.plugins.InstantiatorProvider)
我尝试通过使用 Maven 存储库比较给定版本的 mockito 和相应的 byte buddy 版本来安装不同版本的 mockito 和 byte buddy。我使用 mockito-core 2.28.2 和 bytebuddy 1.9.10
@RunWith(MockitoJUnitRunner.class)
public class LanguageClientTest {
private static final String WORKSPACE_EXECUTE_COMMAND = "workspace/executeCommand"; //$NON-NLS-1$
@Test
public void shouldInitializeLanguageClient() {
//given
LanguageClient mock = mock(LanguageClient.class);
Mockito.doThrow(new IllegalStateException("Error occurred")).when(mock).startListener();
//when
Mockito.when(new LanguageClient()).thenCallRealMethod();
//then
verify(mock, Mockito.times(1)).registerCommands(WORKSPACE_EXECUTE_COMMAND);
}
整个堆栈跟踪:
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.InstantiatorProvider2 (alternate: interface org.mockito.plugins.InstantiatorProvider)
at org.mockito.internal.configuration.plugins.PluginLoader.invoke(PluginLoader.java:74)
at com.sun.proxy.$Proxy17.getInstantiator(Unknown Source)
at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:44)
at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:25)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:62)
at org.mockito.Mockito.mock(Mockito.java:1908)
at org.mockito.internal.configuration.MockAnnotationProcessor.processAnnotationForMock(MockAnnotationProcessor.java:44)
at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:19)
at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:38)
at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:62)
at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:49)
at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:41)
at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:69)
at org.mockito.internal.runners.DefaultInternalRunner.evaluate(DefaultInternalRunner.java:43)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:74)
at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:80)
at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: java.lang.NoClassDefFoundError: org/objenesis/ObjenesisStd
at org.mockito.internal.creation.instance.ObjenesisInstantiator.<init>(ObjenesisInstantiator.java:16)
at org.mockito.internal.creation.instance.DefaultInstantiatorProvider.<clinit>(DefaultInstantiatorProvider.java:13)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.create(DefaultMockitoPlugins.java:68)
at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.getDefaultPlugin(DefaultMockitoPlugins.java:45)
at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:67)
at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:36)
at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:19)
at org.mockito.internal.runners.RunnerFactory.get(RunnerFactory.java:42)
at org.mockito.internal.runners.RunnerFactory.get(RunnerFactory.java:40)
at org.mockito.internal.runners.DefaultInternalRunner.evaluate(DefaultInternalRunner.java:40)
... 19 more
Caused by: java.lang.ClassNotFoundException: org.objenesis.ObjenesisStd
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 31 more
此错误是由于 MANIFEST.MF 中没有 objenesis 库引起的。因此,Eclipse 有时可以与 Mockito 一起正常工作,有时则不能。我在 MANIFEST.MF
中添加了以下几行
org.mockito.mockito-core,
net.bytebuddy.byte-buddy,
org.objenesis
在那之后,我可以在插件依赖项中看到它并且它起作用了。
每当我尝试 运行 Mockito 测试时,Eclipse 都会给出以下输出:
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.InstantiatorProvider2 (alternate: interface org.mockito.plugins.InstantiatorProvider)
我尝试通过使用 Maven 存储库比较给定版本的 mockito 和相应的 byte buddy 版本来安装不同版本的 mockito 和 byte buddy。我使用 mockito-core 2.28.2 和 bytebuddy 1.9.10
@RunWith(MockitoJUnitRunner.class)
public class LanguageClientTest {
private static final String WORKSPACE_EXECUTE_COMMAND = "workspace/executeCommand"; //$NON-NLS-1$
@Test
public void shouldInitializeLanguageClient() {
//given
LanguageClient mock = mock(LanguageClient.class);
Mockito.doThrow(new IllegalStateException("Error occurred")).when(mock).startListener();
//when
Mockito.when(new LanguageClient()).thenCallRealMethod();
//then
verify(mock, Mockito.times(1)).registerCommands(WORKSPACE_EXECUTE_COMMAND);
}
整个堆栈跟踪:
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.InstantiatorProvider2 (alternate: interface org.mockito.plugins.InstantiatorProvider)
at org.mockito.internal.configuration.plugins.PluginLoader.invoke(PluginLoader.java:74)
at com.sun.proxy.$Proxy17.getInstantiator(Unknown Source)
at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:44)
at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:25)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:62)
at org.mockito.Mockito.mock(Mockito.java:1908)
at org.mockito.internal.configuration.MockAnnotationProcessor.processAnnotationForMock(MockAnnotationProcessor.java:44)
at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:19)
at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:38)
at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:62)
at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:49)
at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:41)
at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:69)
at org.mockito.internal.runners.DefaultInternalRunner.evaluate(DefaultInternalRunner.java:43)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:74)
at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:80)
at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: java.lang.NoClassDefFoundError: org/objenesis/ObjenesisStd
at org.mockito.internal.creation.instance.ObjenesisInstantiator.<init>(ObjenesisInstantiator.java:16)
at org.mockito.internal.creation.instance.DefaultInstantiatorProvider.<clinit>(DefaultInstantiatorProvider.java:13)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.create(DefaultMockitoPlugins.java:68)
at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.getDefaultPlugin(DefaultMockitoPlugins.java:45)
at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:67)
at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:36)
at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:19)
at org.mockito.internal.runners.RunnerFactory.get(RunnerFactory.java:42)
at org.mockito.internal.runners.RunnerFactory.get(RunnerFactory.java:40)
at org.mockito.internal.runners.DefaultInternalRunner.evaluate(DefaultInternalRunner.java:40)
... 19 more
Caused by: java.lang.ClassNotFoundException: org.objenesis.ObjenesisStd
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 31 more
此错误是由于 MANIFEST.MF 中没有 objenesis 库引起的。因此,Eclipse 有时可以与 Mockito 一起正常工作,有时则不能。我在 MANIFEST.MF
中添加了以下几行 org.mockito.mockito-core,
net.bytebuddy.byte-buddy,
org.objenesis
在那之后,我可以在插件依赖项中看到它并且它起作用了。