You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为指定Apex类的getMonths与getExpensesByFilters方法编写测试

Apex测试用例编写指南(针对你的费用管理类)

一、测试前的准备工作

  • 先搭建基础测试数据:
    • 插入测试用的Keeper__c记录(假设这是关联的主对象)
    • 为指定年份和Keeper ID插入Month_Expense_Application__c记录,尽量覆盖不同月份,方便验证聚合逻辑
    • 插入关联的ExpenseCard__c记录,设置不同的日期、月份名称、年份,关联到测试Keeper

二、测试getMonths方法

  1. 用@isTest标注测试方法,确保它是测试专用
  2. 核心步骤:
    • 插入提前准备好的测试数据
    • 调用getMonths(year, keeperId)方法,传入测试用的年份和Keeper ID
    • 断言返回的MonthRow列表长度是否符合预期
    • 逐个检查MonthRow的聚合数据(比如总费用)是否和插入的测试数据匹配
    • 验证返回的月份名称是否和monthNumbers映射的结果一致

示例代码片段

@isTest
static void testGetMonths() {
    // 1. 创建测试数据
    Keeper__c testKeeper = new Keeper__c(Name = 'Test Keeper');
    insert testKeeper;

    // 插入2024年1月和2月的月度费用申请
    Month_Expense_Application__c janApp = new Month_Expense_Application__c(
        Year__c = 2024,
        Month__c = 1,
        Keeper__c = testKeeper.Id,
        Total_Expense__c = 1000.00
    );
    Month_Expense_Application__c febApp = new Month_Expense_Application__c(
        Year__c = 2024,
        Month__c = 2,
        Keeper__c = testKeeper.Id,
        Total_Expense__c = 1500.00
    );
    insert new List<SObject>{janApp, febApp};

    // 2. 调用目标方法
    List<MonthRow> result = YourClassName.getMonths(2024, testKeeper.Id);

    // 3. 断言验证
    System.assertEquals(2, result.size(), '应返回2条月度数据');
    for (MonthRow row : result) {
        if (row.monthName == 'January') {
            System.assertEquals(1000.00, row.totalExpense, '1月总费用不符');
        } else if (row.monthName == 'February') {
            System.assertEquals(1500.00, row.totalExpense, '2月总费用不符');
        }
    }
}

三、测试getExpensesByFilters方法

  1. 同样用@isTest标注测试方法
  2. 核心步骤:
    • 插入测试用的Keeper、关联的ExpenseCard__c记录(比如2024年1月的3条记录,分2个不同日期)
    • 调用getExpensesByFilters(year, monthName, keeperId),比如传入2024、'January'、测试Keeper ID
    • 断言返回的分组数据是否正确:日期分组的数量是否和插入的对应月份记录的日期数一致
    • 检查每个分组下的费用记录数量、金额总和是否匹配

示例代码片段

@isTest
static void testGetExpensesByFilters() {
    // 1. 创建测试数据
    Keeper__c testKeeper = new Keeper__c(Name = 'Test Keeper');
    insert testKeeper;

    // 插入2024年1月的两条同日期、一条不同日期的费用卡
    ExpenseCard__c exp1 = new ExpenseCard__c(
        Keeper__c = testKeeper.Id,
        Expense_Date__c = Date.newInstance(2024, 1, 5),
        Amount__c = 200.00,
        Month_Name__c = 'January',
        Year__c = 2024
    );
    ExpenseCard__c exp2 = new ExpenseCard__c(
        Keeper__c = testKeeper.Id,
        Expense_Date__c = Date.newInstance(2024, 1, 5),
        Amount__c = 300.00,
        Month_Name__c = 'January',
        Year__c = 2024
    );
    ExpenseCard__c exp3 = new ExpenseCard__c(
        Keeper__c = testKeeper.Id,
        Expense_Date__c = Date.newInstance(2024, 1, 10),
        Amount__c = 400.00,
        Month_Name__c = 'January',
        Year__c = 2024
    );
    insert new List<SObject>{exp1, exp2, exp3};

    // 2. 调用目标方法
    Map<Date, List<ExpenseCard__c>> result = YourClassName.getExpensesByFilters(2024, 'January', testKeeper.Id);

    // 3. 断言验证
    System.assertEquals(2, result.keySet().size(), '应按2个日期分组');
    System.assertEquals(2, result.get(Date.newInstance(2024,1,5)).size(), '1月5日应有2条记录');
    System.assertEquals(400.00, result.get(Date.newInstance(2024,1,10))[0].Amount__c, '1月10日金额不符');
}

四、额外注意点

  • 测试方法要独立:每个测试方法用自己的测试数据,避免互相干扰
  • 覆盖边界场景:比如没有匹配数据时(调用方法后返回空列表/空Map)、跨年份的数据、单个月份多条聚合记录的情况
  • 如果MonthRow是私有内部类,要给它加@testVisible注解,让测试类能访问
  • 用Test.startTest()和Test.stopTest()包裹方法调用,确保异步操作(如果有的话)执行完成,同时临时提升 governor limit 额度

内容的提问来源于stack exchange,提问作者Jhony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:45:32