在Android的导航组件中测试导航动作

问题描述 投票:0回答:1

最近,我已将导航组件集成到基于单一活动模型的项目中。我试图根据android文档中的教程添加ui测试。但是,当我对该教程进行一些修改时,它不起作用。我的片段中包含以下代码。

val bundle = Bundle().apply {
   putString(UserTrackingConstants.VIEW, UserTrackingConstants.HOME)
}

btnSignUp.setOnClickListener {
findNavController().navigate(R.id.action_from_home_fragment_to_registration_fragment,bundle)
}

因此,每当单击btnSignUp时,它将调用以下导航操作。完美的作品。然后,我添加了以下测试。

@Test
    fun testRegisterButtonClicked() {
        val mockNavController = mock(NavController::class.java)
        val bundle = bundleOf(
                UserTrackingConstants.VIEW to UserTrackingConstants.HOME
        )
        val scenario = launchFragmentInContainer<HomeFragment>()
        scenario.onFragment { fragment ->
            Navigation.setViewNavController(fragment.requireView(), mockNavController)
        }
        onView(withId(R.id.btnSignUp))
                .perform(click())
        verify(mockNavController).navigate(R.id.action_from_home_fragment_to_registration_fragment, bundle)
    }

并且它引发以下异常

E/TestRunner: ----- begin exception -----
    Argument(s) are different! Wanted:
    navController.navigate(
        2131296310,
        Bundle[{view=home}]
    );
    -> at HomeFragmentTest.testRegisterButtonClicked(HomeFragmentTest.kt:87)
    Actual invocation has different arguments:
    navController.navigate(
        2131296310,
        Bundle[{view=home}]
    );
    -> at HomeFragment$setupObservers$2.onClick(HomeFragment.kt:84)

        at HomeFragmentTest.testRegisterButtonClicked(HomeFragmentTest.kt:87)
        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 androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
        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:104)
        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:392)
        at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189)
    ----- end exception -----

Argument(s) are different! Wanted:
navController.navigate(
2131296310,
Bundle[{view=home}]
);
-> at HomeFragmentTest.testRegisterButtonClicked(HomeFragmentTest.kt:87)
Actual invocation has different arguments:
navController.navigate(
2131296310,
Bundle[{view=home}]
);
-> at HomeFragment$setupObservers$2.onClick(HomeFragment.kt:84)

at HomeFragmentTest.testRegisterButtonClicked(HomeFragmentTest.kt:87)
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 androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
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:104)
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:392)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189)

我没有从logcat得到任何有用的信息。看来参数是相同的,应该通过。如果我不通过捆绑包,那就很好。我在以下链接https://developer.android.com/guide/navigation/navigation-testing中关注了文档。我的问题是,有人会遇到这种异常吗,以及如何使用bundle测试导航组件?

android ui-testing android-architecture-navigation android-mvvm
1个回答
0
投票

您确定:

bundleOf(
                UserTrackingConstants.VIEW to UserTrackingConstants.HOME
        )

与:相同

Bundle().apply {
   putString(UserTrackingConstants.VIEW, UserTrackingConstants.HOME)
}
© www.soinside.com 2019 - 2024. All rights reserved.