从任意位置开始测试 Android导航

我有以下导航图startDestination作为card_list:

我有以下导航图startDestination作为card_list

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/card_list">
    <fragment
        android:id="@+id/card_list"
        android:name="bbct.android.common.fragment.BaseballCardList"
        android:label="@string/app_name"
        tools:layout="@layout/card_list">
        <action
            android:id="@+id/action_details"
            app:destination="@id/card_details" />
    </fragment>
    <fragment
        android:id="@+id/card_details"
        android:name="bbct.android.common.fragment.BaseballCardDetails"
        android:label="@string/card_details_title"
        tools:layout="@layout/card_details">
        <argument
            android:name="id"
            app:argType="long" />
    </fragment>
</navigation>

现在我想从card_details开始编写一个测试:

public class NavigationTest {
    @Test
    public void clickOnSaveNavigatesFromDetailsBackToList() {
        TestNavHostController navController = new TestNavHostController(ApplicationProvider.getApplicationContext());
        FragmentScenario<BaseballCardDetails> listScenario = FragmentScenario.launchInContainer(
            BaseballCardDetails.class,
            null,
            R.style.AppTheme
        );
        listScenario.onFragment(fragment -> {
            navController.setGraph(R.navigation.nav_graph);
            Navigation.setViewNavController(fragment.requireView(), navController);
        });
        assertThat(Objects.requireNonNull(navController.getCurrentDestination()).getId())
            .isEqualTo(R.id.card_details);
        BaseballCard card = new BaseballCard(
            true,
            "Mint",
            "Code Guru Apps",
            1993,
            "1",
            50000,
            1,
            "Code Guru",
            "Code Guru Devs",
            "Catcher"
        );
        BBCTTestUtil.sendKeysToCardDetails(card);
        Espresso.onView(ViewMatchers.withId(R.id.save_button)).perform(ViewActions.click());
        assertThat(Objects.requireNonNull(navController.getCurrentDestination()).getId())
            .isEqualTo(R.id.card_list);
    }
}

这失败于

        assertThat(Objects.requireNonNull(navController.getCurrentDestination()).getId())
            .isEqualTo(R.id.card_details);
because theTestNavHostControlleris on thestartDestinationofcard_list.

实际的失败消息是

预期:2131296377

但是:2131296378

在 bbct.android.common.navigation.NavigationTest.clickOnSaveNavigatesFromDetailsBackToList (NavigationTest.java:116)

2131296377is the id forcard_list 2131296378is the id forcard_details

第 116 行是前面提到的assertThat()

我应该通过首先执行用户通常会执行的 UI 操作来导航到card_details来编写这样的测试吗?

依赖关系:

如果它很重要,我有以下导航依赖版本:

    navVersion = '2.4.2'
    implementation "androidx.navigation:navigation-fragment:$navVersion"
    implementation "androidx.navigation:navigation-ui:$navVersion"
1

根据Testing Navigation guide

就像真正的NavController一样,您必须调用setGraph来初始化TestNavHostController。在这个例子中,正在测试的片段是我们的图的开始目标。TestNavHostController提供了一个setCurrentDestination方法,允许您设置当前目标(以及可选的该目标的参数),以便0

所以添加一个调用setCurrentDestination来初始化你的测试在一个特定的目的地:

listScenario.onFragment(fragment -> {
    navController.setGraph(R.navigation.nav_graph);
    // Create arguments using Safe Args generated classes
    // or construct the Bundle directly
    BaseballCardDetailsArgs args = new BaseballCardDetailsArgs.Builder(0).build();
    Bundle arguments = args.toBundle();
    // Then set the current destination to your card_details
    navController.setCurrentDestination(R.id.card_details, arguments);
    Navigation.setViewNavController(fragment.requireView(), navController);
});

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(43)
在AndroidStudioChipmunk中设置覆盖跑步者的位置
上一篇
哪里可以从Android的相机示例应用程序中获取流(实时)视频和音频
下一篇

相关推荐

  • android线程实现多任务并发执行

    示例示例Android线程是指在Android应用程序中使用的线程。它们可以被用来执行后台任务,而不会影响主线程的性能。Android线程有两种实现方式:…

    2023-01-20 04:28:32
    0 35 97
  • android ijkplayer使用:如何使用Android IjkPlayer快速构建视频播放应用

    导入库在项目的build.gradle文件中添加如下依赖:…

    2022-12-31 09:19:12
    0 92 99
  • android 投屏软件轻松实现多屏互动

    Android 投屏软件是一种应用程序,可以将 Android 设备的屏幕内容投射到其他设备上,如电视、投影机或电脑显示器。它可以帮助用户在不同的设备之间共享屏幕内容,从而节省时间和精力。下面是一段示例代码,用于演示如何使用 Android 投屏软件:…

    2023-01-10 10:50:42
    0 20 42
  • android 官网让您的应用变得更好

    Android 官网是一个宣传 Android 操作系统的官方网站,由 Google 运营。该网站提供了有关 Android 的最新信息,包括新闻、论坛、文档、开发者资源以及其他相关信息。此外,它还提供了一些常见问题的回答,以及有关如何使用 Android 的指南。String query = "android news";…

    2023-02-01 09:57:29
    0 68 21
  • android 横向:安卓横向布局的优势

    Android 横向就是指在 Android 应用程序中,将屏幕从竖向改为横向显示。要实现 Android 横向,可以使用 android: 属性来设置 的屏幕方向。…

    2023-01-06 11:11:12
    0 84 16
  • android验证码保护你的手机不受攻击

    Android验证码是指在android应用程序中使用的一种安全机制,用于验证用户的身份。它可以帮助防止恶意用户和攻击者进行未经授权的访问和操作。Android验证码通常包括数字、字母、特殊字符等,并且可以设置验证码的位数,以及可以设置验证码的有效时间。…

    2023-01-22 02:14:22
    0 66 83
  • android ndk开发探索更多机会与挑战

    Android NDK开发是指使用Android NDK(Native Development Kit)来开发Android应用程序的过程。Android NDK是一个工具集,可以让开发者使用C/C++编写原生应用程序,而无需学习Java语言。它可以帮助开发者创建更快、更可靠、更节省电量的应用程序,并且可以在Android设备上运行。…

    2023-01-04 15:06:57
    0 92 49
  • android第三方ui框架:栏

    Android第三方UI框架是指为Android应用开发提供了一系列预先定义的UI组件,以及相关的API和功能的软件库。这些UI框架可以帮助开发者更轻松地创建出引人入胜的应用。…

    2023-01-03 12:29:29
    0 46 18

发表评论

登录 后才能评论

评论列表(24条)