【问题标题】:Kotlin + Mockito + NullPointerException thrown when stubbing存根时抛出 Kotlin + Mockito + NullPointerException
【发布时间】:2019-03-18 23:08:46
【问题描述】:

今天我偶然发现了一个我不理解的情况,可能是因为缺乏对 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()
  • 从 returnBoolean 函数中删除suspend关键字会使错误消失
  • 按照错误消息中的建议使用 onGeneric 也会使错误消失

谁能解释为什么会这样?我们在这里与泛型有多大关系?在我们的实际应用中解决问题的正确方法是什么?有一堆 on {} 和一些 onGeneric {} 吗?

感谢您的帮助!

【问题讨论】:

    标签: kotlin mocking mockito


    【解决方案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)
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多