Тайм-аут в тестах эспрессо, тест не запускается

Существует вспомогательный класс DialogIdlingResource, с помощью которого я пытаюсь выполнить свои тесты. Испытания проходят, за исключением этого. После нажатия кнопки все останавливается.

AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout) 

Фрагмент кода с двумя вспомогательными методами:

  @Test fun signInUserWithInvalidEmail() { goToSignIn() AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, "[email protected]") AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_password, VALID_PASSWORD) AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout) val idlingResource = DialogIdlingResource() registerDialogIdlingResource() unregisterDialogIdlingResource() } private fun registerDialogIdlingResource() { val instrumentation = InstrumentationRegistry.getInstrumentation() idlingResource = DialogIdlingResource() Espresso.registerIdlingResources(idlingResource) } private fun unregisterDialogIdlingResource() { Espresso.unregisterIdlingResources(idlingResource) } 

Вероятно, что ошибка из-за двух методов реестре и отмены регистрации (idlingResource)

Но на самом деле это должно сработать, но может быть где-то, что, вероятно, допустило ошибку, дополнительный код класса:

 class DialogIdlingResource(private val waitTimeSeconds: Int = 5) : IdlingResource { private var resourceCallback: IdlingResource.ResourceCallback? = null private var startTime = -1L override fun getName(): String { return DialogIdlingResource::class.java.name } override fun isIdleNow(): Boolean { if (startTime < 0) { startTime = System.currentTimeMillis() } val timeOut = System.currentTimeMillis() - waitTimeSeconds * 1000 > startTime if (timeOut) throw TimeoutException("error") val idle = !isDialogRunning if (idle && resourceCallback != null) { resourceCallback!!.onTransitionToIdle() } return idle } override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) { this.resourceCallback = resourceCallback } private val isDialogRunning: Boolean get() { try { onView(Matchers.allOf(withId(R.id.titleTextView), ViewMatchers.withText("Warning"))) .check(ViewAssertions.matches(isDisplayed())) } catch (e: NoMatchingViewException) { e.printStackTrace() System.out.println("some text") } return true } 

Также попробуйте решить проблему с помощью следующего решения . И когда я запускаю только один из моих тестов, все работает хорошо. Но если я начну все свои тесты, я поймаю ошибку. Тест Beacause не успел проверить, например, текст в моем диалоговом окне, он открыл диалоговое окно, и это все.

Класс IdlingResource:

 class ElapsedTimeIdlingResource(private val activity: SignActivity?) : IdlingResource { private var callback: IdlingResource.ResourceCallback? = null override fun getName(): String { return "SignInScreenTest" } override fun isIdleNow(): Boolean { val idle = isIdle if (idle) callback!!.onTransitionToIdle() return idle } val isIdle: Boolean get() = activity != null && callback != null override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) { this.callback = resourceCallback } 

}

в моем тесте

 val activity = mActivityTestRule.getActivity() val idlingResource = ElapsedTimeIdlingResource(activity) Espresso.registerIdlingResources(idlingResource) AcceptanceHelper.checkTextView(R.id.titleTextView, "Warning") 

И я повторяю, только когда я запускаю все свои тесты, мне нужно поставить спать между registerIdlingResources и checktextView примерно так:

 SystemClock.sleep(5000) 

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

Извините, но ваш IdlingResource выглядит как супер сложная функция ожидания.

Этот фрагмент кода работает для меня – github link . Вам просто нужно предоставить необходимые параметры для конструктора ViewVisibilityIdlingResource. Один из них – int viewId и другая int visibility . Например, если вы предоставили какой-либо viewId из макета диалога и видимости View.GONE этот ресурс блокирует тесты Espresso, пока вид не будет виден или пока не появится диалоговое окно для пользователя.

Не поймал синтаксис для kotlin.

isIdle () всегда выполняется в основном потоке, который не должен блокироваться. Поэтому вместо вызова isDialogRunning () в isIdle (), вызовите его в отдельном потоке и обновите состояние idlingResource (если время согласовано или тайм-аут), которое затем может быть проверено isIdle ().

Надеюсь, поможет 🙂

Interesting Posts

Котлин: фигурные скобки вокруг нескольких выражений (или высказываний)

Android Things UserSensor.Builder – не удалось создать драйвер датчика расстояния

Kotlin: одно свойство с несколькими сеттерами разных типов

Как проверить функции расширения Kotlin?

SonarQube: как применить несколько профилей качества к одному проекту?

Проверьте, прокручивается ли RecyclerView сверху (findFirstCompletelyVisibleItemPosition не работает)

Числа в kotlin не сериализуемы

Kotlin – как получить значение атрибута аннотации

Есть ли способ перебрать все поля класса данных без использования отражения?

IOException: AsyncTask Image Загрузить Kotlin Android (дескриптор Bad File)

Ошибка при создании Enum в качестве первичного ключа в библиотеке базы данных Room

Нечетный размер с номером MutableList <Int> в Kotlin возвращает IndexOutOfBoundsException с итератором

Невозможно получить классы Kotlin в проекте Java maven для работы (Eclipse)

Иерархия узлов из списка путей каталога

Kotlin – Возможно ли инициализировать объект-компаньон перед блоком init в классе?

Давайте будем гением компьютера.