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

判断布尔值

assertTrue

assertFalse

判断对象非空

assertNull(object);

案例:

java 复制代码
PersistableBundle result = Util.getCarrierConfig(mockContext, subId);

assertNull(result);

判断是否相等

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

java 复制代码
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);
    }
}

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

java 复制代码
//测试类
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。

java 复制代码
    @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());
    }
相关推荐
黄雪超5 小时前
大数据SQL调优专题——引擎优化
大数据·数据库·sql
Zero_pl8 小时前
黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系
单元测试·集成测试
风与沙的较量丶9 小时前
单元测试方法的使用
单元测试·log4j
xlxxy_10 小时前
ABAP数据库表的增改查
开发语言·前端·数据库·sql·oracle·excel
轩昂7K12 小时前
sqoop的sql语言导入方式
前端·sql·sqoop
ChinaRainbowSea14 小时前
1. Linux下 MySQL 的详细安装与使用
linux·数据库·sql·mysql·adb
odoo中国15 小时前
Part 3 第十二章 单元测试 Unit Testing
单元测试·软件工程
Zero_pl15 小时前
单元测试的策略有哪些,主要包括什么?
单元测试
陈小咩咩16 小时前
IDEA单元测试插件 SquareTest 延长试用期权限
java·单元测试·intellij-idea
RainbowSea16 小时前
4. MySQL 逻辑架构说明
数据库·sql·mysql