Android单元测试中的模拟对象使用kotlin - any()给出null

alo*_*loj 9 android unit-testing mockito kotlin

我正在尝试测试我的课程,我需要模拟一个static课程.我的代码如下: -

    PowerMockito.mockStatic(ToolTipUtil::class.java)
    PowerMockito.`when`(ToolTipUtil.wasToolTipShown(any(Context::class.java), "")).thenReturn(true)
    val context = mock(Context::class.java)

    presenter.onResume(context)

    verify(view).setMenuButtonShown(eq(false))
Run Code Online (Sandbox Code Playgroud)

但在第二行它会抛出一个错误:

"java.lang.IllegalStateException: any(Context::class.java) must not be null"
Run Code Online (Sandbox Code Playgroud)

我尝试过mockito-kotlinbefriending-kotlin-and-mockito没有退出.你知道怎么解决吗?

Tpo*_*6oH 13

当您调用时,Mockito经常返回null,any()并且会破坏kotlin的非null参数.

在mockito-kotlin中,它们有一个单独的函数,称为anyOrNull().

你也可以创建自己的功能,在这里他们说这也应该有效.

/**
 * Returns Mockito.any() as nullable type to avoid java.lang.IllegalStateException when
 * null is returned.
 */
fun <T> any(): T = Mockito.any<T>()  
Run Code Online (Sandbox Code Playgroud)

  • 有一个损坏的链接:“[此处](https://github.com/googlesamples/android-architecture/blob/todo-mvp-kotlin/todoapp/app/src/test/java/com/example/android/architecture /blueprints/todoapp/MockitoKotlinHelpers.kt#L38)他们说这应该有效”。我无法编辑该帖子,因为差异太少。 (2认同)

小智 5

在您的测试类中添加以下代码:

private fun <T> any(type : Class<T>): T {
    Mockito.any(type)
    return uninitialized()
}

private fun <T> uninitialized(): T = null as T
Run Code Online (Sandbox Code Playgroud)


Hem*_*mar -1

调用mock()时,不再需要传入类实例。如果类型可以推断,你可以这样写:

val mock : MyClass = mock()
Run Code Online (Sandbox Code Playgroud)

如果无法直接推断类型,请使用:

val mock = mock<MyClass>()
Run Code Online (Sandbox Code Playgroud)

希望它能帮助你!