【发布时间】:2020-08-14 13:45:47
【问题描述】:
我正在尝试声明两个模拟,但我得到一个 java.lang.ClassCastException。
我正在尝试测试我的 MainActivity(它有一个 MainViewModel),所以我需要模拟 MainViewModel。 问题是当我启动 MainActivity 进行测试时,SplashFragment 被注入,因为我正在使用导航组件并且我的 MainActivity 包含一个 NavHostFragment 并且默认情况下启动 SplashFragment(它有一个 SplashViewModel)。
总结:App -> MainActivity(尝试测试MainActivity中的一些常用组件) -> Splash Fragment
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'。检查你的定义!
有什么想法吗?
【问题讨论】:
标签: android unit-testing kotlin mocking koin