Есть вспомогательный класс DialogIdlingResource, благодаря которому пытаюсь запустить свои тесты, все тесты проходят за исключением этого запускается активити и доходит до шага нажатия на кнопку:
AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)
, после чего всё замирает, хотя тест по идее должен отрабатывать(а именно проверять текст в методе isDialogRunning):
@Test
fun signInUserWithInvalidEmail() {
goToSignIn()
AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, "kokojambo@mail.ru")
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)
}
Предпологаю что ошибка из за двух методов регистрации и UNрегистрации 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
}
}
Ответ
Сразу скажу у Вас слишком замудренная реализация того, что можно сделать гораздо проще, ну как мне кажется. На данный момент я вижу два варианта:
Первый вариант подробно описан по ссылке в данной репозитории github.
Принцип которого заключается в проставлении необходимых Вам параметров и место где они распологаются. Также советую обратить внимание на флаги параметра visibility.
Ну а второй вариант будет выглядеть примерно следующим образом. Создаём класс, который унаследуем от 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)
Где мы "получаем" компоненты нашей аквтивности, иначе открытые элементы/переходы возможно приведут к null вашей активити. Как я понял, Вы пытыетесь открыть в Вашей activity диалог. После чего регистируем наши idlingResource из класса. После того как открылся Ваш диалог например, Вы можете проверить элементы содержащиеся в нём, или просто вернуться назад. После всех операций, в этом же тесте нужно вызвать:
Espresso.unregisterIdlingResources(idlingResource)
Также Вы наверное видели уже что возможно поместить методы registerIdlingResource/unregisterIdlingResources в аннотации @Before/@After чтобы не прописывать всегда одно и то же, если тестов скажем несколько.
И опять же для дополнительного чтения : пример использования
Комментариев нет:
Отправить комментарий