kotlin Mockito NullPoInterException固定时抛出



今天,我偶然发现了我不明白的情况,这可能是因为缺乏对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)

[...]

实验表明

  • 行为是仅由布尔返回函数显示的,而不是returnsomestring()
  • 删除悬挂关键字,返回函数使错误消失
  • 错误消息中建议的使用ongeneric也使错误消失

有人可以解释为什么会发生这种情况吗?我们在这里与仿制药有什么关系?在我们的实际应用中解决问题的正确方法是什么?有一堆{}和一些基因{}?

感谢您的帮助!

您应该使用on blocking方法正确模拟悬挂函数

请尝试以下代码:

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

相关内容

  • 没有找到相关文章

最新更新