Тест пользовательского интерфейса — Действие никогда не переходит в запрошенное состояние «[УНИЧТОЖЕНО]» при нажатии на представление внутреннего переработчика

#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 , который пытается закрыть его после каждого теста, но не знаю, почему он не закрывается здесь (основная деятельность все еще активна).

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