Ошибка проверки () Mockito для LiveData postValue - PullRequest
0 голосов
/ 27 сентября 2018

Я создал элемент LoginFragment, который перемещается к другому при успешном входе в систему с использованием компонента архитектуры навигации.Работает нормально, но проверка на это не проходит.Это довольно близкое зеркало примера GithubBrowser, и мой тест очень похож на clickRepo тест здесь , за исключением того, что я тестирую, что новая страница загружается при публикации успешного ресурса вместощелкните.

Ошибка:

Wanted but not invoked:
navController.navigate(
app.ui.login.LoginFragmentDirections$ShowSelectMerchant@377f3c27
);

LoginFragmentTest.kt

@Test
fun success(){
    val user = TestUtil.createUser(email)

    userData.postValue(Resource.success(user))

    System.out.println("Test NavController Hash: " + testFragment.navController.hashCode())
            verify(testFragment.navController).navigate(LoginFragmentDirections.showSelectMerchant().matcher())

}

LoginFragment.kt

override fun openSelectMerchantFragment() {
    System.out.println("Real NavController Hash: " + navController().hashCode())
    navController().navigate(LoginFragmentDirections.showSelectMerchant())
}

openSelectMerchantFragment вызывается, когдаУспешный ресурс публикуется в реальных данных пользователя.Есть ли очевидная причина, по которой тест не пройден?

Я вижу, что макет навигационного контроллера тестового фрагмента и тот, который вызывается в самом фрагменте, имеют одно и то же значение хэша, поэтому я уверен, что это непроблема с тем, как я высмеял активность, фрагмент или навигационный контроллер.Я также ясно вижу, что функция navigate () определенно вызывается.

1 Ответ

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

Проблема здесь заключалась в простой проверке LiveData, как предлагает Иан.Недостаточно добавить TaskExecutorWithIdlingResourceRule, но необходимо вызвать drainTasks(), чтобы завершить размещение данных.Я не могу ответить, почему он работает во всем тестовом классе примера без какого-либо вызова drainTasks, я думаю, что публикация в этих тестах просто завершается достаточно быстро, чтобы это не было проблемой.Я считаю хорошей практикой всегда вызывать drainTasks всякий раз, когда публикуются прямые данные.

Конечный результат:

@Test
fun success(){
    val user = TestUtil.createUser(email)

    userData.postValue(Resource.success(user))
    executorRule.drainTasks(1, TimeUnit.SECONDS)

    verify(testFragment.navController).navigate(LoginFragmentDirections.showSelectMerchant().matcher())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...