Mockito / Powermock与Kotlin没有达到预期的效果

时间:2017-07-05 15:38:45

标签: spring dependency-injection mockito kotlin powermock

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

我正在测试一个注入存储库的Spring @Service类。 我想在我的测试中模拟该存储库,所以我可以只测试类本身。

我是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)
}

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

interface MyRepository: MongoRepository<MyObject, String>

这是我的测试类:

@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 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

我做错了什么?我认为这是一个配置问题,但我无法准确理解错误的位置。

1 个答案:

答案 0 :(得分:0)

似乎你的mockito和powermock版本不能很好地协同工作。您必须使用兼容的版本。请参阅powermock https://github.com/powermock/powermock/wiki/Mockito#supported-versions

的兼容性矩阵

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