为什么 onChange 结果在测试 LiveData 中是 "false"
Why onChange result is "false" in test LiveData
这是我在 Whosebug 上的第一个 post,我是 kotlin 和 Lifecycle 的初学者,需要帮助。我用它浪费了 2 天时间,需要帮助。
我有 SplashViewModel class
class SplashViewModel @Inject constructor(
private val configuration: IConfiguration,
private val compositeDisposable: CompositeDisposable) : BaseViewModel(compositeDisposable), SplashContract.ViewModel{
override val isLoggedLiveData: MutableLiveData<Boolean> = MutableLiveData()
init {
setLoginStatus()
}
override fun setLoginStatus(){
isLoggedLiveData.postValue(configuration.isUserLoggedIn())
}}
SplashViewModelTestclass
class SplashViewModelTest : BaseTest(){
@get:Rule
val testRule = InstantTaskExecutorRule()
@Mock
private lateinit var configuration: IConfiguration
@Mock
private lateinit var compositeDisposable: CompositeDisposable
@Mock
private lateinit var observer: Observer<Boolean>
private lateinit var viewModel: SplashContract.ViewModel
override fun setup() {
super.setup()
trampolineRxPlugin()
viewModel = SplashViewModel(
configuration,
compositeDisposable
)
}
override fun tearDown() {
super.tearDown()
verifyNoMoreInteractions(
configuration,
compositeDisposable
)
}
@Test
fun `should change livedata status to true when viewmodel is initialize`() {
val isLogged = true
`when`(configuration.isUserLoggedIn()).thenReturn(isLogged)
viewModel.isLoggedLiveData.observeForever(observer)
verify(configuration, Mockito.times(1)).isUserLoggedIn()
verify(observer).onChanged(isLogged)
}
当运行这个测试结果是错误的
参数不同!通缉:
observer.onChanged(真);
-> 在 com.example.kotlinmvvm.feature.splash.viewModel.SplashViewModelTest.should 调用 getIsLoggedLiveData 时检查配置用户登录状态(SplashViewModelTest.kt:85)
实际调用有不同的参数:
observer.onChanged(假);
-> 在 androidx.lifecycle.LiveData.considerNotify(LiveData.java:113)
比较失败:
预期:observer.onChanged(真);
实际:observer.onChanged(假);
谁知道发生了什么事?
我怀疑发生的事情是您在调用以下内容之前实例化视图模型(在 setup
中)(使用 isLogged
= true
)...这是导致 init
中的代码被调用...然后它将 return false.
`when`(configuration.isUserLoggedIn()).thenReturn(isLogged)
您是否打算在测试中也显式调用 setLoginStatus
(在上一行之后)?
这是我在 Whosebug 上的第一个 post,我是 kotlin 和 Lifecycle 的初学者,需要帮助。我用它浪费了 2 天时间,需要帮助。
我有 SplashViewModel class
class SplashViewModel @Inject constructor(
private val configuration: IConfiguration,
private val compositeDisposable: CompositeDisposable) : BaseViewModel(compositeDisposable), SplashContract.ViewModel{
override val isLoggedLiveData: MutableLiveData<Boolean> = MutableLiveData()
init {
setLoginStatus()
}
override fun setLoginStatus(){
isLoggedLiveData.postValue(configuration.isUserLoggedIn())
}}
SplashViewModelTestclass
class SplashViewModelTest : BaseTest(){
@get:Rule
val testRule = InstantTaskExecutorRule()
@Mock
private lateinit var configuration: IConfiguration
@Mock
private lateinit var compositeDisposable: CompositeDisposable
@Mock
private lateinit var observer: Observer<Boolean>
private lateinit var viewModel: SplashContract.ViewModel
override fun setup() {
super.setup()
trampolineRxPlugin()
viewModel = SplashViewModel(
configuration,
compositeDisposable
)
}
override fun tearDown() {
super.tearDown()
verifyNoMoreInteractions(
configuration,
compositeDisposable
)
}
@Test
fun `should change livedata status to true when viewmodel is initialize`() {
val isLogged = true
`when`(configuration.isUserLoggedIn()).thenReturn(isLogged)
viewModel.isLoggedLiveData.observeForever(observer)
verify(configuration, Mockito.times(1)).isUserLoggedIn()
verify(observer).onChanged(isLogged)
}
当运行这个测试结果是错误的
参数不同!通缉: observer.onChanged(真); -> 在 com.example.kotlinmvvm.feature.splash.viewModel.SplashViewModelTest.should 调用 getIsLoggedLiveData 时检查配置用户登录状态(SplashViewModelTest.kt:85)
实际调用有不同的参数: observer.onChanged(假); -> 在 androidx.lifecycle.LiveData.considerNotify(LiveData.java:113)
比较失败:
预期:observer.onChanged(真);
实际:observer.onChanged(假);
谁知道发生了什么事?
我怀疑发生的事情是您在调用以下内容之前实例化视图模型(在 setup
中)(使用 isLogged
= true
)...这是导致 init
中的代码被调用...然后它将 return false.
`when`(configuration.isUserLoggedIn()).thenReturn(isLogged)
您是否打算在测试中也显式调用 setLoginStatus
(在上一行之后)?