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());
    }
相关推荐
Minyy114 小时前
牛客网刷题SQL--高级查询
数据库·sql
YueTann5 小时前
Leetcode SQL 刷题与答案-基础篇
sql·算法·leetcode
web136885658718 小时前
Spring Boot 中使用 @Transactional 注解配置事务管理
数据库·spring boot·sql
qq_10799104058 小时前
E172 ASP.NET+SQL+C#+LW+图书管理系统的设计与实现 配置 源码 文档 全套资料
sql·c#·asp.net
老牛源码9 小时前
2290 ASP.NET+SQL+LW+基于.NET旅游网站系统的开发与实现 源码 配置 文档
sql·asp.net·.net·旅游
GoodStudyAndDayDayUp12 小时前
一个老是用的SQL
java·数据库·sql
张一西13 小时前
ARM学习(35)单元测试框架以及MinGW GCC覆盖率报告
单元测试·mingw·gcc·覆盖率·cppunit·gcov
先睡13 小时前
动态sql
java·数据库·sql