为了测试,我为 ViewModelProviders.of(...).get(...)
写了一个包装器这样我就可以提供一个模拟:
class MyViewModelProvider {
fun <T : ViewModel> get(scope: Fragment, type: Class<T>) : T {
return ViewModelProviders.of(scope).get(type)
}
...
}
然后在我的测试中:
Dagger 测试模块:
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
我尝试了一些事情:
交换
any<Fragment>(), any<Class<ViewModel>>())
与anyOrNull<Fragment>(), anyOrNull<Class<ViewModel>>()
--> 还是报错尝试使用具体引用
whenever(mockViewModelProvider.get(myFragment, MyViewModel::class.java)).thenReturn(mockViewModel)
--> 调用实际方法而不是模拟
不确定我做错了什么......
最佳答案
找到答案:
mocked函数需要标记为open
或者使用mock-maker-inline。
https://github.com/nhaarman/mockito-kotlin/wiki/Parameter-specified-as-non-null-is-null
关于android - 每当参数时 mockito-kotlin - 指定为非空的参数为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54047452/