首页 > 解决方案 > mockito-kotlin 每当参数 - 指定为非 null 的参数为 null

问题描述

为了测试,我编写了一个包装器,ViewModelProviders.of(...).get(...)以便我可以提供一个模拟:

class MyViewModelProvider {
    fun <T : ViewModel> get(scope: Fragment, type: Class<T>) : T {
        return ViewModelProviders.of(scope).get(type)
    }

    ...
}

然后在我的测试中:

匕首测试模块:

import com.nhaarman.mockito_kotlin.mock

...

fun provideMyViewModelProvider(): MyViewModelProvider {
        return mock()
}

在我的测试课上:

import com.nhaarman.mockito_kotlin.any
import com.nhaarman.mockito_kotlin.anyOrNull
import com.nhaarman.mockito_kotlin.whenever
...
@Inject
lateinit var mockViewModelProvider: MyViewModelProvider
...
val mockViewModel = mock<MyViewModel>()

whenever(mockViewModelProvider.get(any<Fragment>(), any<Class<ViewModel>>())).thenReturn(mockViewModel)
...

然而,whenever我得到了错误:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter scope

我尝试了几件事:

  1. any<Fragment>(), any<Class<ViewModel>>())与-->交换anyOrNull<Fragment>(), anyOrNull<Class<ViewModel>>()仍然得到相同的错误

  2. 尝试使用具体引用whenever(mockViewModelProvider.get(myFragment, MyViewModel::class.java)).thenReturn(mockViewModel)--> 调用实际方法而不是模拟

不知道我做错了什么......

标签: androidkotlinmockito

解决方案


找到了答案:

模拟函数需要标记open或使用mock-maker-inline。

https://github.com/nhaarman/mockito-kotlin/wiki/Parameter-specified-as-non-null-is-null


推荐阅读