Hi, after updating koin from 2.1.5 to 2.2.1, I’m n...
# koin
p
Hi, after updating koin from 2.1.5 to 2.2.1, I’m no longer able to mock
MyViewModel
in android Robolectric UI tests:
Copy code
@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):
Copy code
@AllOpenAnnotation
class MyViewModel(
   /* ... */
) : ViewModel()
It throws following exception when fragment scenario launches:
Copy code
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?
a
underlying VM factory has changed 🤔
need to reproduce it
p
Tested fragment shares view model and it crashes on first access:
Copy code
class XYZFragment : Fragment() {

    private val viewModel by sharedViewModel<MyViewModel>()
}
and it throws exception on first view model access:
Copy code
@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)
    }
}
a
any chance to bring a little project to help reproduce it?
p
Ok, I’ll try to prepare sth next week.
a
would be great 👍