pawegio
11/25/2020, 2:17 PMMyViewModel
in android Robolectric UI tests:
@get:Rule
val koinTestRule = KoinTestRule.create {
androidContext(testApplication)
modules(listOf(
/* modules */,
module { viewModel(override = true) { mock<MyViewModel> { /* ... */ } },
))
}
I use all-open plugin to open view model class for testing purpose (to perform stubbing):
@AllOpenAnnotation
class MyViewModel(
/* ... */
) : ViewModel()
It throws following exception when fragment scenario launches:
java.lang.NullPointerException
at androidx.lifecycle.ViewModel.setTagIfAbsent(ViewModel.java:157)
at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:70)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at org.koin.androidx.viewmodel.ViewModelResolverKt.get(ViewModelResolver.kt:23)
at org.koin.androidx.viewmodel.ViewModelResolverKt.resolveInstance(ViewModelResolver.kt:12)
at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:86)
at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:72)
at org.koin.androidx.viewmodel.koin.KoinExtKt.getViewModel(KoinExt.kt:41)
at org.koin.androidx.viewmodel.ext.android.FragmentExtKt.getViewModel(FragmentExt.kt:71)
at com.xyz.XYZFragment$$special$$inlined$sharedViewModel$2.invoke(SharedViewModelExt.kt:79)
at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
at com.xyz.XYZFragment.getViewModel(XYZFragment.kt)
any tips?arnaud.giuliani
11/25/2020, 3:15 PMarnaud.giuliani
11/25/2020, 3:15 PMpawegio
11/26/2020, 8:13 AMclass XYZFragment : Fragment() {
private val viewModel by sharedViewModel<MyViewModel>()
}
and it throws exception on first view model access:
@RunWith(AndroidJUnit4::class)
class XYZFragmentTest : KoinTest {
@get:Rule
val rule = ActivityTestRule(TestSupportActivity::class.java, true, true)
@get:Rule
val mockProvider = MockProviderRule.create { clazz ->
Mockito.mock(clazz.java)
}
@get:Rule
val koinTestRule = KoinTestRule.create {
androidContext(testApplication)
modules(listOf(
/* modules */,
module { viewModel(override = true) { viewModel } }
))
}
@Before
fun before() {
// throws exception launchFragmentInContainer<XYZFragment>(Bundle(), android.R.style.Theme_Material_NoActionBar)
}
}
arnaud.giuliani
11/26/2020, 12:31 PMpawegio
11/26/2020, 12:40 PMarnaud.giuliani
11/26/2020, 12:47 PM