Android 单元测试断言校验方法 org.junit.Assert

news2024/12/27 3:22:05

判断布尔值

assertTrue

assertFalse

判断对象非空

assertNull(object);

 案例:

PersistableBundle result = Util.getCarrierConfig(mockContext, subId);

assertNull(result);

 

判断是否相等

assertEquals("mocked_string", result.toString());

package org.junit;

public class Assert {
    /**
     * Asserts that two objects are equal. If they are not, an
     * {@link AssertionError} without a message is thrown. If
     * <code>expected</code> and <code>actual</code> are <code>null</code>,
     * they are considered equal.
     *
     * @param expected expected value
     * @param actual the value to check against <code>expected</code>
     */
    public static void assertEquals(Object expected, Object actual) {
        assertEquals(null, expected, actual);
    }
}

可以用于字符串比较,比如下面的查询条件拼接

//测试类
public class ApnSettingsTest {

    @Test
    public void testGetFillListQuery_initialWhereEmpty() {
        StringBuilder where = new StringBuilder();
        int subId = 1;

        // Mock the behavior of getSelection method
        when(mFragment.getSelection("", subId)).thenReturn("mocked_selection");

        StringBuilder result = mFragment.getFillListQuery(where, subId);

        // Verify the `where` has the expected selection
        assertEquals("mocked_selection", result.toString());

        // Check log output (Could use a library or a custom handler to intercept logs)
        // For simplicity, assuming log validation is part of the manual test validation process.
    }

    //TODO: 存在问题的测试接口,为什么其他两个getSelection可以返回预期??
    @Test
    public void testGetFillListQuery_initialWhereNonEmpty() {
        StringBuilder where = new StringBuilder("existing_condition");
        int subId = 1;

        // Mock the behavior of getSelection method,没生效?
        when(mFragment.getSelection("existing_condition", subId)).thenReturn(" AND mocked_selection");

        StringBuilder result = mFragment.getFillListQuery(where, subId);

        // Verify the `where` has the expected selection
        // 校验存在问题
        assertEquals("existing_condition AND mocked_selection", result.toString());

        // Check log output similarly as mentioned in previous test
    }

    @Test
    public void testGetFillListQuery_differentSubId() {
        StringBuilder where = new StringBuilder();
        int subId = 2;

        // Mock the behavior of getSelection method
        when(mFragment.getSelection("", subId)).thenReturn("different_selection");

        StringBuilder result = mFragment.getFillListQuery(where, subId);

        // Verify the `where` has the expected selection
        assertEquals("different_selection", result.toString());

        // Check log output similarly as mentioned in previous tests
    }

}


//被测试类
public class DemoSettings {

    @VisibleForTesting
    StringBuilder getFillListQuery(StringBuilder where, int subId) {
        String selection = "";
        selection = getSelection(selection, subId);
        where.append(selection);    // 拼接新增的过滤条件
        return where;
    }

    /**
     * Customize the cursor select conditions with subId releated to SIM.
     */
    String getSelection(String selection, int subId) {

        boolean isCustomized = true;
        Context context = getContext();
        if (context != null) {
            isCustomized = SubscriptionManager.getResourcesForSubId(getContext().getApplicationContext(), subId)
                    .getBoolean(R.bool.config_is_customize_selection);
        }

        if(!isCustomized) return selection;

        // 注意有两个双引号的地方:第一个转义",第二个是字符串匹配
        // 拼接的查询语句等效于:
        // (type = 0 or sub_id = $传入值)
        // SQL 查询语句:
        // SELECT *
        // FROM your_table
        // WHERE status = 'active' AND (type = "0" OR sub_id = "subId");
        String where = "(" + " type =\"" + "0" + "\"";
        where += " or sub_id =\"" + subId + "\"";
        where += " or type =\"" + "2" + "\"" + ")";
        selection = selection + " and " + where;
        return where;
    }

    // Additional tests could be written to consider edge cases, such as:
    // - Negative subId values
    // - Null or invalid StringBuilder where value
    // In real scenario, depending on codebase other relevant checks can also be added.

}

上述代码校验存在问题,报错如下:

Expected :existing_condition AND mocked_selection
Actual   :existing_condition and (type ="0" or sub_id ="1" or type ="2")
<Click to see difference>

org.junit.ComparisonFailure: expected:<existing_condition [AND mocked_selection]> but was:<existing_condition [and (type ="0" or sub_id ="1" or type ="2")]>

修改后pass的逻辑,因为内部会自己创建where值,不知道为什么不按 when.thenReturn 的返回 mocked_selection

    @Test
    public void testGetFillListQuery_initialWhereNonEmpty() {
        StringBuilder where = new StringBuilder("existing_condition");
        int subId = 1;

        // Mock the behavior of getSelection method
        when(mFragment.getSelection("", subId))
                .thenReturn(" and (type ='0' or sub_id ='1' or type ='2')");

        StringBuilder result = mFragment.getFillListQuery(where, subId);

        // Verify the `where` has the expected selection
        assertEquals("existing_condition and (type ='0' or sub_id ='1' or type  ='2')",
                result.toString());
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink 中双流 Join 的深度解析与实战

目录 一、Join 算子 一&#xff09;语义与特性 二&#xff09;通用用法 三&#xff09;不同窗口类型表现 滚动窗口 Join 滑动窗口 Join 二、CoGroup 算子 一&#xff09;功能特点 二&#xff09;通用用法与连接类型实现 内连接&#xff08;InnerJoin&#xff09; 左…

OpenStack-Glance组件

Glance Glance使用磁盘格式和容器格式基础配置镜像转换 Glance 是 OpenStack 的镜像服务&#xff0c;负责存储、发现和管理虚拟机镜像。它允许用户创建和共享镜像&#xff0c;用于启动虚拟机实例。 Glance 的主要功能 &#xff08;1&#xff09;虚拟机镜像的管理 支持镜像的上…

基于神经网络的弹弹堂类游戏弹道快速预测

目录 一、 目的... 1 1.1 输入与输出.... 1 1.2 隐网络架构设计.... 1 1.3 激活函数与损失函数.... 1 二、 训练... 2 2.1 数据加载与预处理.... 2 2.2 训练过程.... 2 2.3 训练参数与设置.... 2 三、 测试与分析... 2 3.1 性能对比.... 2 3.2 训练过程差异.... 3 四、…

Linux入门攻坚——40、Linux集群系统入门-lvs(1)

Cluster&#xff0c;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展&#xff0c;系统扩展的方式&#xff1a;scale up&#xff0c;向上扩展&#xff0c;更换更好的主机&#xff1b;scale out&#xff0c;向外扩展&…

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段&#xff1a;1.Qfile Pro和2.Qsync Pro&#xff0c;实践使用中存在一些区别&#xff0c;针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…

Docker单机网络:解锁本地开发环境的无限潜能

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

【Linux操作系统】多线程控制(创建,等待,终止、分离)

目录 一、线程与轻量级进程的关系二、进程创建1.线程创建线程创建函数&#xff08;pthread&#xff09;查看和理解线程id主线程与其他线程之间的关系 三、线程等待&#xff08;回收&#xff09;四、线程退出线程退出情况线程退出方法 五、线程分离线程的优点线程的缺点 一、线程…

解决IDEA的easycode插件生成的mapper.xml文件字段之间逗号丢失

问题 easycode插件生成的mapper.xml文件字段之间逗号丢失&#xff0c;如图 解决办法 将easycode(在settings里面的othersettings)设置里面的Template的mapper.xml.vm和Global Config的mybatisSupport.vm的所有$velocityHasNext换成$foreach.hasNext Template的mapper.xml.vm(…

Android 实现中英文切换

在开发海外项目的时候&#xff0c;需要实现app内部的中英文切换功能&#xff0c;所有的英文都是内置的&#xff0c;整体思路为&#xff1a; 创建一个sp对象&#xff0c;存储当前系统的语言类型&#xff0c;然后在BaseActivity中对语言进行判断&#xff1b; //公共Activitypubl…

11月 | Apache DolphinScheduler月度进展总结

各位热爱 Apache DolphinScheduler 的小伙伴们&#xff0c;社区10月份月报更新啦&#xff01;这里将记录 DolphinScheduler 社区每月的重要更新&#xff0c;欢迎关注&#xff01; 月度Merge之星 感谢以下小伙伴11月份为 Apache DolphinScheduler 所做的精彩贡献&#xff08;排…

[软件开发幼稚指数评比]《软件方法》自测题解析010

第1章自测题 Part2 **9 [**单选题] 以下说法和其他三个最不类似的是: A)如果允许一次走两步&#xff0c;新手也能击败象棋大师 B)百米短跑比赛才10秒钟&#xff0c;不可能为每一秒做周密计划&#xff0c;凭感觉跑就是 C)即使是最好的足球队&#xff0c;也不能保证每…

【JavaWeb后端学习笔记】使用IDEA连接MySQL数据库

IDEA连接MySQL IDEA中集成了DataGrip&#xff0c;因此可以直接使用IDEA操作MySQL数据库。 1.创建一个新的空工程。点击右侧的数据库标志。 2.选择要连接的数据库。第一步&#xff1a;点击“”&#xff1b;第二步&#xff1a;点击 Data Source&#xff1b;第三步&#xff1a;选…

大模型分类2—按训练方式

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl根据训练方式,大模型可分为监督学习、无监督学习、自监督学习和强化学习大模型。 1. 监督学习大模型 1.1 定义与原理 监督学习大模型是一种机器学习范式,它依赖于标记数据集进行训练。这些数据…

鸿蒙特色实战2

服务卡片开发 创建服务卡片 创建一个新的工程后&#xff0c;可以通过如下方法进行创建服务卡片&#xff1a; 创建服务卡片包括如下两种方式&#xff1a; 选择模块&#xff08;如entry模块&#xff09;下的任意文件&#xff0c;单击菜单栏File > New > Service Widget创…

LCD1602液晶显示屏指令详解

文章目录 LCD1602液晶显示屏1.简介2. 液晶引脚说明3. 指令介绍3.1 清屏指令3.2 光标归位指令3.3 进入模式设置指令3.4 显示开关设置指令3.5 设定显示或光标移动方向指令3.6 功能设定指令3.7 设定CGRAM地址指令3.8 设定DDRAM地址指令3.9 读取忙或AC地址指令3.10 总图3.11 DDRAM …

Python毕业设计选题:基于大数据的旅游景区推荐系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页界面 用户注册界面 用户登录界面 景点信息界面 景点资讯界面 个人中心界面 …

引领素养教育行业,猿辅导素养课斩获“2024影响力教育品牌”奖项

近日&#xff0c;由教育界网、校长邦联合主办&#xff0c;鲸媒体、职教共创会协办的“第9届榜样教育年度盛典”评奖结果揭晓。据了解&#xff0c;此次评选共有近500家企业提交参评资料进行奖项角逐&#xff0c;历经教育界权威专家、资深教育从业者以及专业评审团队的多轮严格筛…

十七、监控与度量-Prometheus/Grafana/Actuator

文章目录 前言一、Spring Boot Actuator1. 简介2. 添加依赖2. 开启端点3. 暴露端点4. 总结 二、Prometheus1. 简介2. Prometheus客户端3. Prometheus服务端4. 总结 三、Grafana1. 简介2. Grafana安装3. Grafana配置 前言 系统监控‌ 在企业级的应用中&#xff0c;系统监控至关…

PHP语法学习(第六天)

&#x1f4a1;依照惯例&#xff0c;回顾一下昨天讲的内容 PHP语法学习(第五天)主要讲了PHP中的常量和运算符的运用。 &#x1f525; 想要学习更多PHP语法相关内容点击“PHP专栏” 今天给大家讲课的角色是&#x1f34d;菠萝吹雪&#xff0c;“我菠萝吹雪吹的不是雪&#xff0c;而…

关于遥感图像镶嵌后出现斑点情况的解决方案

把几张GF1的影像镶嵌在一起后&#xff0c;结果在Arcgis里出现了明显的斑点情况&#xff08;在ENVI里显示则不会出现&#xff09;&#xff0c;个人觉得可能是斑点噪声问题&#xff0c;遂用Arcgis的滤波工具进行滤波处理&#xff0c;但由于该工具本身没有直接设置对多波段处理方式…