Сегодня я наткнулся на ситуацию, которую я не понимаю, возможно, из-за недостатка понимания того, как mockito и mockito-kotlin работают внутри.
Учитывая приведенный ниже код, с моей точки зрения начинающего Kotlin, у меня есть два довольно похожих метода интерфейса. Один возвращает Boolean, один String. Обе функции приостановки в моем примере, как и в моей реальной ситуации, мои функции тоже.
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)
[...]
Эксперименты показали, что
- поведение только , показанное логической возвращающей функцией, а не returnSomeString ()
- удаление ключевого слова suspend из функции returnBoolean устраняет ошибку
- использование onGeneric, как указано в сообщении об ошибке, также устраняет ошибку
Может кто-нибудь объяснить, почему это происходит? В какой степени мы здесь имеем дело с генериками? И каков будет правильный способ решения проблемы в нашем реальном приложении? Есть куча on {} и немного onGeneric {}?
Спасибо за вашу помощь!