如何为指定Apex类的getMonths与getExpensesByFilters方法编写测试
Apex测试用例编写指南(针对你的费用管理类)
一、测试前的准备工作
- 先搭建基础测试数据:
- 插入测试用的
Keeper__c记录(假设这是关联的主对象) - 为指定年份和Keeper ID插入
Month_Expense_Application__c记录,尽量覆盖不同月份,方便验证聚合逻辑 - 插入关联的
ExpenseCard__c记录,设置不同的日期、月份名称、年份,关联到测试Keeper
- 插入测试用的
二、测试getMonths方法
- 用
@isTest标注测试方法,确保它是测试专用 - 核心步骤:
- 插入提前准备好的测试数据
- 调用
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方法
- 同样用
@isTest标注测试方法 - 核心步骤:
- 插入测试用的Keeper、关联的
ExpenseCard__c记录(比如2024年1月的3条记录,分2个不同日期) - 调用
getExpensesByFilters(year, monthName, keeperId),比如传入2024、'January'、测试Keeper ID - 断言返回的分组数据是否正确:日期分组的数量是否和插入的对应月份记录的日期数一致
- 检查每个分组下的费用记录数量、金额总和是否匹配
- 插入测试用的Keeper、关联的
示例代码片段
@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
相关产品推荐
相关产品推荐

