Это первый мой пост о 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);
Кто знает, что происходит?
Я подозреваю, что происходит то, что вы создаете экземпляр модели представления (в setup) до последующего вызова (с isLogged = true) ... что вызывает вызов кода в init ... и в этот момент он вернется ложный.
`when`(configuration.isUserLoggedIn()).thenReturn(isLogged)
Возможно, вы намеревались явно вызвать setLoginStatus в своем тесте (после строки выше)?
В этом случае вы вызвали его дважды - один раз в блоке init и еще раз, когда вы вызывали его в тесте. Судя по названию теста (которое я пропустил при первоначальном ответе), вы специально тестируете, что setLoginStatus вызывается в блоке init .... в этом случае я бы назвал `when (configuration.isUserLoggedIn ()). ThenReturn (isLogged) `перед созданием экземпляра модели представления
Когда я добавляю
viewModel.setLoginStatus()и меняюverify(configuration, times(2)).isUserLoggedIn(), то onChange вернет true и проверка пройдена. Но правильно ли это сделать? Извините, но это мои первые тесты :)