如何在对话框片段上运行单元测试?

2024-02-19

我正在尝试为 DialogFragment 创建一个独立的单元测试,以便 DialogFragment 可以单独进行测试。我正在使用 FragmentScenario 启动 DialogFragment,现在我正在尝试确认是否显示对话框消息,但最终我将测试按钮单击。

class ResetScoreDialog (val viewModel: MyViewModel) : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            // Use the Builder class for convenient dialog construction
            val builder = AlertDialog.Builder(it)
            builder.setMessage(getString(R.string.resetscore_dialog_message))
                .setPositiveButton(getString(R.string.confirm),
                    DialogInterface.OnClickListener { dialog, id ->
                        viewModel.resetScore()
                    })

            // Create the AlertDialog object and return it
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")

    }
}

My Test

@RunWith(RobolectricTestRunner::class)
class ResetScoreDialogTest {

    private lateinit var scenario: FragmentScenario<ResetScoreDialog>

    private lateinit var viewModel: MyViewModel

    @Before
    fun setup() {
        viewModel = mock (MyViewModel::class.java)
        scenario = launchFragmentInContainer(
            factory = MainFragmentFactory(viewModel),
            fragmentArgs = null,
            themeResId = R.style.Theme_TDDScoreKeeper
        )
    }

    @Test
    fun `Dialog Displayed`() {
        onView(withText(R.string.resetscore_dialog_message))

            .check(matches(isDisplayed()))
    }
}

当我运行测试时,出现以下错误。

androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131755113>

View Hierarchy:
+>DecorView{id=-1, visibility=VISIBLE, width=320, height=470, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302f8
  fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS
  pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1} 
|
+->LinearLayout{id=-1, visibility=VISIBLE, width=320, height=470, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.FrameLayout$LayoutParams@4ed1c9d4, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2} 
|
+-->ViewStub{id=16908682, res-name=action_mode_bar_stub, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@5853ff65, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0} 
|
+-->FrameLayout{id=16908290, res-name=content, visibility=VISIBLE, width=320, height=470, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@188c12d2, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=0} 

尝试了不同的解决方案。

        scenario.onFragment {
        onView(withText(R.string.resetscore_dialog_message))
            .check(matches(isDisplayed()))
        }

androidx.test.espresso.NoMatchingViewException:层次结构中没有找到匹配的视图:资源 ID 中的字符串:

        onView(withText(R.string.resetscore_dialog_message))
            .inRoot(isDialog())
            .check(matches(isDisplayed()))

androidx.test.espresso.NoMatchingRootException:匹配器“是对话框”与以下任何根都不匹配:[Root {application-window-token = android.view.ViewRootImpl $W@b421ae4,window-token = android.view.ViewRootImpl $W@b421ae4,has-window-focus=true,layout-params-type=1,layout-params-string={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302f8 fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS

        scenario.onFragment {
        onView(withText(R.string.resetscore_dialog_message))
            .inRoot(isDialog())
            .check(matches(isDisplayed()))
        }

androidx.test.espresso.NoMatchingRootException:匹配器“是对话框”与以下任何根都不匹配:[Root {application-window-token = android.view.ViewRootImpl $ W@65799e3f,window-token = android.view.ViewRootImpl $W@65799e3f,has-window-focus=true,layout-params-type=1,layout-params-string={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302f8 fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS


你不能使用launchFragmentInContainer在测试一个DialogFragment.

切换到launchFragment扩大

在测试类中放置一个类似的函数,并在每次测试之前调用它:

/**
  * Launch YuorDialogFragment dialogfragment
  */
private fun openDialogFragment(): FragmentScenario<YuorDialogFragment> {
  return launchFragment(
    themeResId = R.style.AppTheme
  ) {
    return@launchFragment YuorDialogFragment(
      ViewModelUtil.createFor(mockViewModel)
    );
  }
}

将对话框测试放入androidTest folder

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在对话框片段上运行单元测试? 的相关文章

  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • React Native 从 JavaScript 代码内部访问 strings.xml

    有没有办法访问当前值android app src main res values strings xml从 JavaScript 代码内部 我想为每个构建放置不同的端点 URL 但我什至无法检测到反应本机代码内的构建类型 而不必求助于 D
  • Android - 从资产中解析巨大(超大)JSON 文件的最佳方法

    我正在尝试从资产文件夹中解析一些巨大的 JSON 文件 我如何加载并添加到 RecyclerView 我想知道解析这种大文件 大约 6MB 的最佳方法是什么 以及您是否知道可以帮助我处理此文件的良好 API 我建议您使用GSON lib h
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • 找不到处理意图 com.instagram.share.ADD_TO_STORY 的活动

    在我们的 React Native 应用程序中 我们试图让用户根据视图 组件中的选择直接将特定图像共享到提要或故事 当我们尝试直接使用 com instagram share ADD TO FEED 进行共享时 它以一致的方式完美运行 但是
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 发布android后更改应用内购买项目的价格

    在 Google Play 上发布后 是否可以更改应用内购买商品的价格 我假设该应用程序也已发布 完整的在线文档位于http developer android com http developer android com也http sup
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分

随机推荐

  • 按电话号码搜索联系人

    在我的应用程序中 用户输入一个电话号码 我想查找该电话号码的联系人姓名 我通常这样搜索联系人 Cursor cur getContentResolver query ContactsContract Contacts CONTENT URI
  • Django 1.7 - makemigrations 为非托管模型创建迁移

    我正在我的应用程序中创建一些动态 Django 模型 除了迁移系统之外 一切似乎都按预期工作 如果我创建一个动态 Django 模型并设置 Managed False Django 的makemigrations命令仍会为该新模型生成迁移
  • 如何从嵌套的 CollectionView 单元格传递按钮操作?

    我有一个 MainCollectionView 用于在项目之间滚动 在这些单元格之一内我有另一个带有单元格的 collectionView 在该集合视图中 每个单元格都有一个按钮 我的问题是 当点击按钮时 如何将操作从按钮传递到 MainC
  • 尝试在 C# 中使用 ODBC 调用 Oracle 包时出现语法错误

    我正在尝试使用 ODBC 和 C 使用 Oracle 9i 包 我尝试使用中描述的语法here http support microsoft com kb 310130 here https stackoverflow com questi
  • 为什么seaborn图不显示置信区间/误差线?

    我在用sns lineplot在图中显示置信区间 sns lineplot x threshold y mrl array err style band ci 95 plt show 我得到以下图 它不显示置信区间 有什么问题 As of
  • 使用 UPX 压缩 Windows 可执行文件有什么缺点吗?

    我用过UPX http upx sourceforge net 之前曾减少过我的 Windows 可执行文件的大小 但我必须承认 我对这可能产生的任何负面影响很天真 所有这些打包 拆包的缺点是什么 是否存在任何人建议不要对可执行文件进行 U
  • Service Worker js 中的 Fetch() 无法发送请求标头?

    我的代码相同 我正在调用 fetch 但网络和服务器中的请求没有像 cookie 这样的请求标头 我又找到了一篇关于这个的帖子Service Worker 未发送请求标头 https stackoverflow com questions
  • 何时应终止 Excel VBA 变量或将其设置为 Nothing?

    过去两年我一直在自学 Excel VBA 我认为有时在代码段末尾处理变量是合适的 例如 我已经看到它在这个位中完成 改编自Ron de Bruin 将 Excel 转换为 HTML 的代码 http www rondebruin nl ma
  • TypeORM jsonb 数组列

    我正在开发一个节点微服务 orm和b分别是typeorm and postgresql 我正在尝试创建jsonb数组列 但我可能没有以正确的方式进行操作 Notes 我通常会通过简单地添加一个简单的额外实体和关系来完成此任务 在这种情况下
  • Phonegap + jQuery Ajax Post 不起作用

    我正在尝试将数据作为 POST 数据从我正在使用 jQuery 开发的 PhoneGap 应用程序发送到本地页面 ajax method POST url http api return php data name John locatio
  • Twig 更改元数据

    我需要获取树枝中页面的元数据 以便用我的值替换它们 但我不知道如何获取它们 现在我有 if spec name matches meta set getdatas app request server get REQUEST URI use
  • php - 在 处爆炸字符串。但忽略小数,例如 2.9

    目前我正在爆炸一个字符串 它按我喜欢的方式工作 唯一的问题是 当 以小数点形式出现 有没有办法排除decimal来自爆炸函数的点 我当前的设置 正如你所看到的 它正在爆炸 两个数字之间 String This is a string It
  • Powershell - 从 csv 文件获取行并输出到不同 csv 文件的更快方法

    我有一个包含大约 250 000 行的 csv 文件 此 csv 文件中的第一个标题是 营销活动参考代码 我还有一个需要在第一列中查找的活动参考代码列表 即 COLMABQ140 COLMABQ141 如果我在第一列中找到此活动参考代码 我
  • C# 如何在 GridView 上创建超链接 OnClick 事件?

    我在创建我想要的 GridView 时遇到问题 我希望用户进入网站并查看附加到数据库的 GridView 列是 ID InsertionTime Filepath ProccessedByUser现在我希望用户单击他 她想要处理的文件路径
  • 无法使用自动配置脚本在代理后面下载嵌入式 MongoDB

    我有一个使用 Maven 构建的 Spring Boot 项目 我打算在其中使用嵌入式 mongo db 我在 Windows 7 上使用 Eclipse 正如我在 Internet 选项 的 连接 选项卡中观察到的那样 我位于使用自动配置
  • 在 JavaScript 中,如何检测迭代器返回键值条目?

    考虑以下函数 当传递一个可迭代的东西时 该函数尝试实现通用行为 let f function thing if typeof thing Symbol iterator function for let key value of thing
  • 使用.Net Core创建UDP套接字

    如何创建一个 UDP 套接字以非阻塞方式接收本地端点中的数据 我不知道数据来自的远程端口 我在 Linux 中使用 NET Core 我认为我可以使用 ReceiveAsync 但它似乎无法以这种方式工作 我这样解决了这个问题 static
  • 应用程序配置不允许给定 URL

    我正在尝试根据以下内容创建 Facebook 登录页面this https developers facebook com docs facebook login getting started web 教程 我只改变了两行 appId 3
  • Openpyxl:如何在检查单元格是否包含特定值后复制行

    我有一个工作表 每周都会更新数千行 并且需要在过滤后从该工作表传输行 我正在使用当前代码查找具有所需值的单元格 然后将整行传输到另一张工作表 但保存文件后 出现 IndexError 列表索引超出范围 异常 我使用的代码如下 import
  • 如何在对话框片段上运行单元测试?

    我正在尝试为 DialogFragment 创建一个独立的单元测试 以便 DialogFragment 可以单独进行测试 我正在使用 FragmentScenario 启动 DialogFragment 现在我正在尝试确认是否显示对话框消息