Android JUnit 首选项测试

2023-12-29

一个相当正常的场景:Android 应用程序有一个首选项活动,从 ListPreference 中选择一个选项会触发代码来更改该 ListPreference 的摘要文本。即:从颜色 ListPreference 中选择“绿色”将通过以下方式将 ListPreference 的摘要文本更改为“绿色”:onPreferenceChange打回来。

我希望能够使用 Android JUnit 测试来确认这些摘要更改均已正确执行。然而,关于如何做到这一点的信息似乎很少。

我尝试过使用的变体setValue()在 ListPreference 上,无论是在测试线程中还是通过runOnUiThread(),没有成功 - 这不会触发对onPreferenceChange()。我也尝试过getInstrumentation().waitForIdleSync()打电话后setValue(),但这也没有成功。

所以,我的问题是:这是如何完成的?

Thanks!


几个小时的工作产生了这个工作解决方案,但我很好奇是否其他人有更好的解决方案。这段代码的灵感来自这个解决方案 https://stackoverflow.com/questions/4805896/how-to-open-or-simulate-a-click-on-a-android-preference-which-was-created-with-x/4869034#4869034类似的问题,但这种情况有两点不同:

  1. 它旨在供 Android JUnit 使用,这意味着它需要通过以下方式调用 ListPreference UI 点击runOnUiThread().
  2. 它期望使用偏好类别,这使得查找要单击的位置(相对于整个偏好列表)变得复杂。上述解决方案仅适用于没有偏好类别的情况。

此方法将接受特定 ListPreference 项目的键,以及列表中要单击的项目的位置。然后它将执行该列表项单击,其他代码将执行我正在寻找的检查。

请注意,这需要setActivityInitialTouchMode(true);要在之前设置getActivity()调用setUp() method.

private void clickListPreference(String _listPreferenceKey, int _listItemPos){
    final String listPreferenceKey = _listPreferenceKey;
    final int listItemPos = _listItemPos;

    mActivity.runOnUiThread(
            new Runnable() {
                public void run() {
                    // get a handle to the particular ListPreference
                    ListPreference listPreference= (ListPreference) mActivity.findPreference(listPreferenceKey);

                    // bring up the dialog box  
                    mActivity.getPreferenceScreen().onItemClick( null, null, getPreferencePosition(), 0 ); 

                    // click the requested item
                    AlertDialog listDialog = (AlertDialog) listPreference.getDialog();
                    ListView listView = listDialog.getListView();
                    listView.performItemClick(listView, listItemPos, 0);
                }

                /***
                 * Finding a ListPreference is difficult when Preference Categories are involved,
                 * as the category header itself counts as a position in the preferences screen
                 * list.
                 * 
                 * This method iterates over the preference items inside preference categories
                 * to find the ListPreference that is wanted.
                 * 
                 * @return The position of the ListPreference relative to the entire preferences screen list
                 */
                private int getPreferencePosition(){
                    int counter = 0;
                    PreferenceScreen screen = mActivity.getPreferenceScreen();

                     // loop over categories
                    for (int i = 0; i < screen.getPreferenceCount(); i++){
                        PreferenceCategory cat = (PreferenceCategory) screen.getPreference(i);
                        counter++;

                        // loop over category items
                        for (int j = 0; j < cat.getPreferenceCount(); j++){ 
                            if (cat.getPreference(j).getKey().contentEquals(listPreferenceKey)){
                                return counter;
                            }
                            counter++;
                        }
                    }
                    return 0; // did not match
                }
            }
    );

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

Android JUnit 首选项测试 的相关文章

随机推荐

  • 如何可视化大图?

    我正在尝试创建一个节点数量超过 400 个的图表 但未以正确的方式进行可视化 import networkx as nx G nx MultiGraph G add nodes from freqItemSet G add edges fr
  • 使用curl发送cookie

    我正在使用curl 来检索cookie 如下所示 curl c cookies txt url 然后我从 cookies txt 文件中解析我想要的 cookie 并使用 cookie 再次发送请求 curl b name value ur
  • 求解二次方程但出现奇怪的错误

    我正在尝试用 Fortran 语言编写第一个程序 尝试求解二次方程 我对我的代码进行了两次和三次检查 没有发现任何问题 我不断在不同位置收到 1 处名称中的无效字符 和 1 处无法分类的语句 代码有什么问题吗 This program so
  • 向 t-SNE 模型添加新点

    我尝试在 scikit learn 中使用 t SNE 算法 import numpy as np from sklearn manifold import TSNE X np array 0 0 0 0 1 1 1 0 1 1 1 1 m
  • 错误 itms-90035 - Xcode

    我开发了一个phonegap应用程序 它在iPhone上运行得非常好 现在 我想将应用程序提交到应用程序商店 以下是我提交应用程序时遵循的程序 打开 Xcode 并存档项目 点击验证 即成功 单击 提交到应用程序商店 这是我收到以下错误的地
  • svn merge --dry-run 显示 svn diff

    我正在使用一个代码库 历史上 是手动合并的 而不是通过svn merge 我试图通过向每个人证明合并是多么有用来改变这一点 但当我进行空运行时 我得到了这个 svn merge Repo URL c 21355 21358 21364 21
  • 如何提高 Google 语音识别对分隔数字的准确性

    我们将此图像提供给我们的用户 在此输入图像描述 https i stack imgur com 2jkBp jpg 这张图片代表单独的数字 我们所有的用户都会在麦克风中将其读为 11 0 9 5 我们使用 Google Speech Eng
  • ASP.NET Core 3.0 [FromBody] 字符串内容返回“JSON 值无法转换为 System.String”。

    Using FromBody 上的字符串内容ApiController在 ASP NET Core 3 0 中返回验证错误 type https tools ietf org html rfc7231 section 6 5 1 title
  • 如何在一行中将输入流重定向到输出流?

    我想做这个 cout lt lt cin 而不是这个 int x cin gt gt x cout lt
  • 整个计算机的文件观察器(替代方案?)

    我想编写一个应用程序来获取整个计算机上每个文件更改的事件 以在文件位置 权限和我的应用程序的数据库之间进行同步 我正在考虑使用 net filewatcher 类 但经过一些测试后我发现了以下限制 1 文件观察器有一个缓冲区 http ms
  • C 中的 String.indexOf 函数

    是否有 C 库函数可以返回字符串中字符的索引 到目前为止 我发现的只是像 strstr 这样的函数 它将返回找到的 char 而不是它在原始字符串中的位置 strstr返回指向找到的字符的指针 因此您可以使用指针算术 注意 此代码未测试其编
  • 找不到使用 sqlplus 控制台创建的目录

    我使用 SQLPlus 控制台创建了一个目录 但在文件系统上找不到它 这是我使用的命令 SQL gt create directory secfile as opt oracle Directory created 我查看了我的 Oracl
  • ModuleNotFoundError:没有名为“django.utils.six”的模块[重复]

    这个问题在这里已经有答案了 HTTP GET admin 500 0 00 127 0 0 1 51425 回溯 最近一次调用最后一次 文件 C Program Files x86 Microsoft Visual Studio Share
  • 在 UnhandledException 上显示消息对话框

    在我的应用程序中 我想在出现任何未处理的异常时显示消息对话框 但当抛出未处理的异常时 似乎没有出现对话框消息 显示消息弹出窗口是否有效 另外在 MSDN 文档中我没有找到太多相关信息 以下是我正在使用的测试代码 public App thi
  • 如何判断元素是否具有流体宽度[重复]

    这个问题在这里已经有答案了 可能的重复 使用 JavaScript 确定元素是否具有固定宽度或百分比宽度 https stackoverflow com questions 1782566 determine whether element
  • “InMemoryUploadedFile”对象没有属性“encode”

    我正在尝试在 Django 中发送一封带有附件的电子邮件 文件是request FILE file 对象 InMemoryUploadedFile 类型 我通过创建消息EmailMessage 然后附加文件message attach f
  • R 中的数据框和列表有什么区别?

    有什么区别数据框 and list in R 什么时候应该使用哪一个 哪个更容易循环 确切的问题 我必须首先存储 3 个字符串元素 如 a b c 稍后 对于其中的每一个 我都需要附加 3 个元素 例如 对于 a 我必须添加 a1 a2 a
  • 合并两个数据框,其中一列根据条件匹配

    模拟数据 set seed 1 df1 lt data frame country c US UK year c 2000 2003 df2 lt data frame country rep c US UK 10 year rep 200
  • java.lang.RuntimeException:无法实例化活动 ComponentInfo

    我试图运行示例代码 在 android 1 5 模拟器中启动应用程序时 我遇到了这些错误 有人有一些提示吗 来自 LogCat 的错误 01 13 02 28 08 392 ERROR AndroidRuntime 2888 FATAL E
  • Android JUnit 首选项测试

    一个相当正常的场景 Android 应用程序有一个首选项活动 从 ListPreference 中选择一个选项会触发代码来更改该 ListPreference 的摘要文本 即 从颜色 ListPreference 中选择 绿色 将通过以下方