Почему результат onChange является "ложным" в тесте LiveData
Это первая моя статья о stackru, и я новичок в kotlin, Lifecycle, мне нужна помощь с этим. Я потерял 2 дня с ним и нуждаюсь в помощи.
У меня есть класс SplashViewModel
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())
}}
Класс SplashViewModelTest
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)
}
При запуске этот результат теста является ошибкой
Аргумент (ы) разные! Требуются: наблюдатель.onChanged(правда); -> at com.example.kotlinmvvm.feature.splash.viewModel.SplashViewModelTest.should проверять состояние входа пользователя конфигурации при вызове getIsLoggedLiveData (SplashViewModelTest.kt:85)
Фактический вызов имеет разные аргументы: Наблюдатель.onChanged(ложь); -> на androidx.lifecycle.LiveData.considerNotify(LiveData.java:113)
Ошибка сравнения:
Ожидаемый: наблюдатель.onChanged(правда);
Фактически: наблюдатель.onChanged(ложь);
Кто знает, что происходит?
1 ответ
Я подозреваю, что происходит то, что вы создаете модель представления (в setup
) до следующего вызова (с isLogged
знак равно true
)... который вызывает код в init
чтобы быть вызванным... и в этот момент он вернет ложь.
`when`(configuration.isUserLoggedIn()).thenReturn(isLogged)
Вы намеревались, возможно, явно позвонить setLoginStatus
в вашем тесте (после строки выше)?