Kotlin + Mockito + NullPointerException выбрасывается при заглушении - PullRequest
3 голосов
/ 19 марта 2019

Сегодня я наткнулся на ситуацию, которую я не понимаю, возможно, из-за недостатка понимания того, как 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 {}?

Спасибо за вашу помощь!

...