Создание исключения NoMatchingViewException при тестировании пользовательского интерфейса Android с помощью эспрессо - PullRequest
0 голосов
/ 17 января 2019

При тестировании recyclerView, присутствующего в моем приложении, я создаю пользовательские утверждения RecyclerView и действия для выполнения на них тестов Espresso.

У меня есть RecyclerView, который имеет 4 дочерних макета. Мне нужно выполнить действия и утверждения на детей этих макетов. ViewAssertion, который я внедряю, должен занять позицию в recyclerView, идентификатор ресурса и утверждение, которое мне нужно выполнить на этом дочернем элементе.

При переопределении метода check я нашел интересующее меня представление, а затем вызвал метод проверки переданного утверждения. Вот мой проблемный NoMatchingViewException, поскольку метод проверки выглядит следующим образом:
override fun check(view: View?, noViewFoundException: NoMatchingViewException?)

Я понимаю, что передача нуля вместо noViewFoundException означает, что представление не было найдено.

Что мне не нравится в моем коде, так это блок try catch. Если я правильно понимаю NoMatchingViewException, он должен быть создан, когда элемент, для которого вы хотите выполнить утверждение, не найден. Если я ошибаюсь, скажите мне, пожалуйста.

Вызов метода.

val childView: View?
return try {
    childView = itemAtPosition.findViewById(viewId)
    viewAssertion.check(
        childView, null
    )
} catch (e: Exception) {
    viewAssertion.check(null, 
    ExceptionBuilderHelper.buildNoMatchingViewException(recyclerView, viewId))
}

И метод buildNoMatchingViewException:

fun buildNoMatchingViewException(rootView: View, searchedViewId: Int) : NoMatchingViewException {
    return  NoMatchingViewException.Builder()
        .withRootView(rootView)
        .withViewMatcher(ViewMatchers.withId(searchedViewId))
        //TODO: fix the list of nulls...
        .withAdapterViews(listOf(null))
        .withAdapterViewWarning(EspressoOptional.absent())
        .withCause(java.lang.IllegalStateException("No view in recyclerView of id: " + rootView.id + " with id: " + searchedViewId))
        .build()
}

Как и в TODO, я не хочу создавать listOf (null), поскольку это более чем глупо. Как правильно построить это исключение? Если этот код подходит, то, что должно быть передано в методах компоновщика - особенно withAdapterViews.

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