Почему результат onChange в тесте LiveData ложный

Это первый мой пост о stackoverflow, и я новичок в 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)
}

При запуске этого теста результатом является ошибка

Аргументы разные! Хотел: Observer.onChanged (правда); -> в com.example.kotlinmvvm.feature.splash.viewModel.SplashViewModelTest. должен проверять состояние входа пользователя конфигурации при вызове getIsLoggedLiveData (SplashViewModelTest.kt: 85)

Фактический вызов имеет разные аргументы: Observer.onChanged (ложь); -> в androidx.lifecycle.LiveData.considerNotify (LiveData.java:113)

Ошибка сравнения:

Ожидается: Observer.onChanged (true);

Актуально: Observer.onChanged (false);

Кто знает, что происходит?

0
0
964
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я подозреваю, что происходит то, что вы создаете экземпляр модели представления (в setup) до последующего вызова (с isLogged = true) ... что вызывает вызов кода в init ... и в этот момент он вернется ложный.

`when`(configuration.isUserLoggedIn()).thenReturn(isLogged)

Возможно, вы намеревались явно вызвать setLoginStatus в своем тесте (после строки выше)?

Когда я добавляю viewModel.setLoginStatus() и меняю verify(configuration, times(2)).isUserLoggedIn(), то onChange вернет true и проверка пройдена. Но правильно ли это сделать? Извините, но это мои первые тесты :)

Michał Skiba 26.10.2018 20:20

В этом случае вы вызвали его дважды - один раз в блоке init и еще раз, когда вы вызывали его в тесте. Судя по названию теста (которое я пропустил при первоначальном ответе), вы специально тестируете, что setLoginStatus вызывается в блоке init .... в этом случае я бы назвал `when (configuration.isUserLoggedIn ()). ThenReturn (isLogged) `перед созданием экземпляра модели представления

John O'Reilly 26.10.2018 20:23

Другие вопросы по теме