为了进行测试,我为ViewModelProviders.of(...).get(...)编写了一个包装器,以便提供一个模拟:
class MyViewModelProvider {
fun <T : ViewModel> get(scope: Fragment, type: Class<T>) : T {
return ViewModelProviders.of(scope).get(type)
}
...
}然后在我的测试中:
匕首TestModule:
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) ->调用实际方法而不是模拟不知道我做错了什么..。
发布于 2019-01-05 15:01:39
找到了答案:
模拟的函数需要标记为open或使用模拟制造者内联。
https://github.com/nhaarman/mockito-kotlin/wiki/Parameter-specified-as-non-null-is-null
https://stackoverflow.com/questions/54047452
复制相似问题