今天,我偶然发现了一个我不了解的情况,可能是因为缺乏对Mockito和Mockito-kotlin内部工作方式的了解。
考虑到下面的代码,从我的Kotlin初学者的角度来看,我有两个非常相似的接口方法。一个返回布尔值,一个返回字符串。在我的示例中,这两个都是暂停函数,因为在现实世界中,我的函数也是。
class ITestInterface {
suspend fun returnBoolean(): Boolean {
return true
}
suspend fun returnSomeString() : String {
return "String"
}
}
@Test
fun demoTest() {
val implMock = mock<ITestInterface> {
on {
runBlocking {
returnSomeString()
}
} doReturn "Hello"
on {
runBlocking {
returnBoolean()
}
} doReturn false
}
}
我的观察是,当我运行测试时,如上所述,我收到以下错误消息
com.nhaarman.mockitokotlin2.MockitoKotlinException: NullPointerException thrown when stubbing.
This may be due to two reasons:
- The method you're trying to stub threw an NPE: look at the stack trace below;
- You're trying to stub a generic method: try `onGeneric` instead.
at com.nhaarman.mockitokotlin2.KStubbing.on(KStubbing.kt:72)
at com.rewedigital.fulfillment.picking.components.substitute.DemoTest.demoTest(DemoTest.kt:30)
[...]
实验表明
有人可以解释为什么会这样吗?在这里,与泛型有什么关系?在我们的实际应用中解决问题的正确方法是什么?有一堆on {}和一些onGeneric {}吗?
感谢您的帮助!
答案 0 :(得分:1)
您应该使用onBlocking方法正确模拟暂停功能
请尝试以下代码:
@Test
fun demoTest() {
val implMock = mock<ITestInterface> {
onBlocking {
returnSomeString()
} doReturn "Hello"
onBlocking {
returnBoolean()
} doReturn false
}
runBlocking {
// Execute your code here
assertThat(implMock.returnSomeString()).isEqualTo("Hello")
assertThat(implMock.returnBoolean()).isEqualTo(false)
}
}