For testing I wrote a wrapper for ViewModelProviders.of(...).get(...) so that I can supply a mock:
class MyViewModelProvider {
fun <T : ViewModel> get(scope: Fragment, type: Class<T>) : T {
return ViewModelProviders.of(scope).get(type)
}
...
}
And then in my test:
Dagger TestModule:
import com.nhaarman.mockito_kotlin.mock
...
fun provideMyViewModelProvider(): MyViewModelProvider {
return mock()
}
And in my test class:
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)
...
However on the line with whenever I get the error:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter scope
I've tried a couple things:
Swapping
any<Fragment>(), any<Class<ViewModel>>())withanyOrNull<Fragment>(), anyOrNull<Class<ViewModel>>()--> still get the same errorTried using concrete references
whenever(mockViewModelProvider.get(myFragment, MyViewModel::class.java)).thenReturn(mockViewModel)--> Calls actual method instead of mock
Not sure what I'm doing wrong...