Mockito / Powermock不像Kotlin预期的那样工作

我使用mockito / powermock版本1.7.0,Spring Boot 2.0.0 M2,Kotlin 1.3.0。

我正在测试一个Spring @Service类,注入一个Repository。 我想在我的测试中嘲笑这个存储库,所以我可以测试这个类本身。

我是Kotlin的新手,但我来自Java,所以我尝试了这种“java方式”,但可能我错过了一些东西…

这是我的服务界面:

 interface MyService { fun create(myObject: MyObject): MyObject } 

…及其实施:

 @Service class DefaultMyService : MyService { @Autowired lateinit var myRepository: MyRepository override fun create(myObject: MyObject): MyObject = this.myRepository.insert(myObject) } 

这里是我的存储库(我使用Mongo的Spring Data):

 interface MyRepository: MongoRepository 

这是我的测试课:

 @RunWith(PowerMockRunner::class) @PrepareForTest(MyService::class) class MyServiceTest { @Mock lateinit var myRepository: MyRepository @InjectMocks lateinit var myService: MyService @Test fun shouldDoSomething() { val myObject = MyObject(name = "Marco") `when`(myRepository.insert(myObject)).thenReturn(myObject) assertEquals(myObject.name, this.myService.create(myObject).name) } } 

当我运行这个测试时,会发生一个exception:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/mockito/exceptions/Reporter at sun.reflect.GeneratedSerializationConstructorAccessor5.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:48) at org.powermock.reflect.internal.WhiteboxImpl.newInstance(WhiteboxImpl.java:260) at org.powermock.reflect.Whitebox.newInstance(Whitebox.java:139) at org.powermock.api.extension.reporter.AbstractMockingFrameworkReporterFactory.getInstanceForClassLoader(AbstractMockingFrameworkReporterFactory.java:41) at org.powermock.api.extension.reporter.AbstractMockingFrameworkReporterFactory.create(AbstractMockingFrameworkReporterFactory.java:35) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.getMockingFrameworkReporter(JUnit4TestSuiteChunkerImpl.java:140) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:119) 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.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: java.lang.ClassNotFoundException: org.mockito.exceptions.Reporter 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) ... 16 more 

我究竟做错了什么? 我认为这是一个配置问题,但我不能确切地知道错误在哪里。

看起来你的mockito和powermock版本在一起工作不是很好。 你必须使用兼容的版本。 请参阅powermock的兼容性矩阵https://github.com/powermock/powermock/wiki/Mockito#supported-versions

最新的兼容是Mockito: 2.8.x与PowerMock: 1.7.0