#android #testing #android-recyclerview #android-espresso
#Android #тестирование #android-recyclerview #android-эспрессо
Вопрос:
Я пытаюсь провести тест пользовательского интерфейса в Android. Домашняя страница представляет собой представление переработчика с элементами, которые сами по себе имеют представление переработчика.
Я нахожу, что, когда я click()
просматриваю изображение внутреннего переработчика, я вижу на эмуляторе, что оно ведет меня на следующую страницу. Затем код в тесте заканчивается, приложение закрывается. Тем не менее, тест фактически продолжает выполняться (около 50 секунд), а затем бросает:
java.lang.AssertionError: Activity never becomes requested state "[DESTROYED]" (last lifecycle transition = "RESUMED") at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:338) at androidx.test.core.app.ActivityScenario.moveToState(ActivityScenario.java:555) at androidx.test.core.app.ActivityScenario.close(ActivityScenario.java:308) at androidx.test.ext.junit.rules.ActivityScenarioRule.after(ActivityScenarioRule.java:108) at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:50) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:154) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at org.junit.runner.JUnitCore.run(JUnitCore.java:115) at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56) at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:444) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2205)
Это мой тест пользовательского интерфейса. Он использует чашку Каспрессо/Какао.
@RunWith(AndroidJUnit4::class) class HomeFragmentTest { @get:Rule val mainActivityScenarioRule = ActivityScenarioRule(MainActivity::class.java) @Test fun clickBanner_goesTo_productListOrWebView() { HomeScreen { homeRecyclerView { // Click top banners firstChildlt;HomeScreen.HomeItemgt; { innerRecyclerView { firstChildlt;HomeScreen.InnerHomeItemgt; { banner { click() } } } } } } } } object HomeScreen: KScreenlt;HomeScreengt;() { override val layoutId: Int = R.layout.fragment_home override val viewClass: Classlt;*gt; = HomeFragment::class.java val homeRecyclerView: KRecyclerView = KRecyclerView ( builder = { withId(R.id.home_page_recycler_view) }, itemTypeBuilder = { itemType(::HomeItem) } ) class HomeItem(parent: Matcherlt;Viewgt;) : KRecyclerItemlt;HomeItemgt;(parent) { val innerRecyclerView: KRecyclerView = KRecyclerView ( parent = parent, builder = { withId(R.id.recyclerView) }, itemTypeBuilder = { itemType(::InnerHomeItem) } ) } class InnerHomeItem(parent: Matcherlt;Viewgt;) : KRecyclerItemlt;InnerHomeItemgt;(parent) { val banner = KImageView(parent) { withId(R.id.home_list_banner_product_image) } } }
I’m certain the issue with the code is the click()
done on the banner
. If I call click()
on the parent recycler view or do some sort of assertion elsewhere, the test ends properly and doesn’t linger and throw the above exception.
HomeScreen { homeRecyclerView { click() // Click top banners firstChildlt;HomeScreen.HomeItemgt; { innerRecyclerView { firstChildlt;HomeScreen.InnerHomeItemgt; { banner { } } } } } }
Я действительно не уверен, почему вызов click()
любого элемента представления внутреннего переработчика вызывает задержку этого теста пользовательского интерфейса после завершения тестового кода и продолжает выполняться до тех пор, пока он не вызовет исключение. Я думаю, что исключение составляет тот MainActivityRule
, который пытается закрыть его после каждого теста, но не знаю, почему он не закрывается здесь (основная деятельность все еще активна).
Визуально на эмуляторе я вижу, что щелчок прошел успешно, и он выводит меня на новый экран, затем закрывает приложение, но тест продолжает выполняться до тех пор, пока не возникнет исключение.