如何解决Koin测试clarifyMock无法使用倍数声明
我试图声明两个模拟,但是我遇到了java.lang.ClassCastException。
我正在尝试测试MainActivity(具有MainViewModel),因此我需要模拟MainViewModel。 问题是,当我启动MainActivity进行测试时,由于我正在使用导航组件,并且我的MainActivity包含NavHostFragment并默认启动SplashFragment(具有SplashViewModel),因此会注入SplashFragment。
摘要:应用程序-> MainActivity(尝试测试MainActivity中的一些常见组件)->飞溅片段
private val testViewState = MediatorLiveData<MainViewState>()
private val testSplashViewState = MediatorLiveData<SplashViewState>()
@Rule
@JvmField
var mockSplashViewModelRule = MockProviderRule.create {
mock(SplashViewModel::class.java)
}
@Rule
@JvmField
var mockViewModelRule = MockProviderRule.create {
mock(MainViewModel::class.java)
}
private fun launchMainActivity() {
declareMock<SplashViewModel> {
given(viewState).willReturn(testSplashViewState)
}
declareMock<MainViewModel> {
given(viewState).willReturn(testViewState)
}
activityScenarioRule.scenario
}
我收到此错误: java.lang.ClassCastException:SplashViewModel无法转换为MainViewModel
如果我没有声明SplashViewModel,我将得到: java.lang.RuntimeException:org.koin.core.error.NoBeanDefFoundException:未找到类“ SplashViewModel”的定义。检查您的定义!
有什么想法吗?
解决方法
我以这种方式解决了
private val testSplashViewState = MediatorLiveData<SplashViewState>()
private val testViewState = MediatorLiveData<MainViewState>()
@Mock
private lateinit var mainViewModel: MainViewModel
@Mock
private lateinit var splashViewModel: SplashViewModel
@Rule
@JvmField
var activityScenarioRule = LateInitActivityScenarioRule(MainActivity::class.java,false)
val module = module(createdAtStart = true,override = true) {
viewModel { splashViewModel }
viewModel { mainViewModel }
}
@Before
fun setupMainActivityTest() {
loadKoinModules(module)
}
@After
fun afterMainActivityTest() {
unloadKoinModules(module)
}
private fun launchMainActivity() {
testSplashViewState.value = SplashViewState()
whenever(splashViewModel.viewState).thenReturn(testSplashViewState)
testViewState.value = MainViewState()
whenever(mainViewModel.viewState).thenReturn(testViewState)
activityScenarioRule.scenario
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。