Почему результат onChange является «ложным» в тесте LiveData - PullRequest
0 голосов
/ 26 октября 2018

Это мой первый пост на 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)
}

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

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

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

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

Ожидается: Наблюдатель.onChanged (верно);

Фактически: наблюдатель.onChanged (false);

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

1 Ответ

0 голосов
/ 26 октября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...