java - Android Espresso 测试在物理设备上失败(PerformException)

标签 java android android-recyclerview integration-testing android-espresso

嗨,所以我有这个应用程序,里面有这个 RecipeActivity 和一个 recyclerview。

当您单击一个列表项时,它会打开另一个 Activity ,并在 Intent 中传递一个额外的内容。

我只想用 Espresso 测试这个简单的功能(我从它开始)。 这是我的代码:
@RunWith(AndroidJUnit4.class)
    public class ShowIngredientsTest {
    @Rule
    public IntentsTestRule<RecipeActivity> testRule =
        new IntentsTestRule<>(RecipeActivity.class);

    @Test
    public void checkIfIntentWorks() {
        onView(withId(R.id.recipes_recyclerview))
            .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));

        intended(hasExtraWithKey(RECIPE_PARCEL));
    }
}

现在,奇怪的是当我在 Nexus 5.0 (Android 7.0) 模拟器上运行它时 它通过了(我已经尝试了两次以确保)。

当我在我的Oneplus 3(搭载 Android 7.1.1)(或者甚至在与 Nexus 5.0 具有相同 API 级别的另一个模拟器)上尝试时,它没有。 这是错误信息:

android.support.test.espresso.PerformException: Error performing 'android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction@3d98130' on view 'with id: com.onval.bakingapp:id/recipes_recyclerview'.
    at android.support.test.espresso.PerformException$Builder.build(PerformException.java:83)
    at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:80)
    at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56)
    at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
    at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
    at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
    at com.onval.bakingapp.ShowIngredientsTest.checkIfIngredientsAreShows(ShowIngredientsTest.java:34)
    at java.lang.reflect.Method.invoke(Native Method)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55)
    at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270)
    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 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 android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2110)
    Caused by: java.lang.IllegalStateException: No view holder at position: 0
    at android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction.perform(RecyclerViewActions.java:290)
    at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6321)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
    Tests ran to completion.

它会是什么?为什么模拟器可以执行位置 0 处的操作却不能?为什么明明存在,却说 viewholder 不存在于该位置?模拟器没有这个问题!

我唯一的想法是物理设备更快,它会在创建取景器之前进行检查......我试图添加一个
.perform(RecyclerViewActions.scrollToPosition(0))

介于 onView 和 actionOnItemAtPosition 之间,但它无论如何都不起作用。

我错过了什么?先感谢您!

最佳答案

好的,我解决了,我需要使用 IdlingResources。

关于java - Android Espresso 测试在物理设备上失败(PerformException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46959184/

相关文章:

android - 从字符串中获取资源 ID

java - 如何缓存 Json 数据以供离线使用?

java - EasyMock 和 Unitils 相当于 Mockito @InjectMocks

android - 如何在 Kotlin 中将数组转换为集合(HashSet)?

android - 如何在android中的sqlite中删除第一个位置的行

android - 将水平 RecyclerView 项目与边框对齐

android - 使 AppBarLayout/CollapsingToolbarLayout 对 ViewPager 中的 RecyclerView 中的滚动使用react

java - 使用 FirebaseRecyclerAdapter 将 Firebase 实时数据库中的数据检索到 Recycler View 中

java - 人工智能: Graph search and A* implementation with Manhattan Heuristic

java - 我正在尝试在 Applet 中添加音频 url