如何为获取Picklist值的Apex方法编写@test测试代码?
问题描述
我一直在寻找相关答案但一无所获,这可能是个新手问题,但我确实遇到了瓶颈。我想要编写一段Apex测试代码,目标是测试一个从特定对象中获取字段名的Apex方法(字段名后续会在LWC的Picklist中依次展示,该部分由JS和HTML实现)。目前我只想测试这段Apex代码,但不知道如何验证方法接收的对象和字段参数是否正确,以及返回的列表值是否准确,因此陷入了困境。
需要测试的Apex类及方法:
public without sharing class LeadController { public static List<String> getMultiPicklistValues(String objectType, String selectedField) { List<String> plValues = new List<String>(); Schema.SObjectType convertToObj = Schema.getGlobalDescribe().get(objectType); Schema.DescribeSObjectResult objDescribe = convertToObj.getDescribe(); Schema.DescribeFieldResult objFieldInfo = objDescribe.fields.getMap().get(selectedField).getDescribe(); List<Schema.PicklistEntry> picklistvalues = objFieldInfo.getPicklistValues(); for(Schema.PicklistEntry plv: picklistvalues) { plValues.add(plv.getValue()); } plValues.sort(); return plValues; } }
解决方案
针对这个方法,我们可以从正常输入验证和异常场景验证两个角度编写测试类,确保方法逻辑正确。
完整测试类代码
@isTest private class LeadControllerTest { // 测试有效输入场景:传入存在的对象和多选项字段,验证返回值 @isTest static void testGetMultiPicklistValues_ValidInput() { // 替换为你Org中Lead对象实际存在的多选项字段API名 String targetObject = 'Lead'; String targetField = 'Custom_MultiPicklist__c'; // 调用待测试方法 List<String> resultValues = LeadController.getMultiPicklistValues(targetObject, targetField); // 获取该字段的预期选项值(用于对比) Schema.SObjectType objType = Schema.getGlobalDescribe().get(targetObject); Schema.DescribeFieldResult fieldDesc = objType.getDescribe().fields.getMap().get(targetField).getDescribe(); List<String> expectedValues = new List<String>(); for(Schema.PicklistEntry entry : fieldDesc.getPicklistValues()) { expectedValues.add(entry.getValue()); } expectedValues.sort(); // 验证返回结果不为空 System.assertNotEquals(null, resultValues, '返回的选项列表不应为空'); System.assert(!resultValues.isEmpty(), '返回的选项列表不应为空'); // 验证返回列表长度与预期一致 System.assertEquals(expectedValues.size(), resultValues.size(), '返回列表长度和预期不匹配'); // 逐值验证排序后的选项是否一致 for(Integer i = 0; i < expectedValues.size(); i++) { System.assertEquals(expectedValues[i], resultValues[i], String.format('第{0}个选项值不匹配', new List<String>{String.valueOf(i+1)})); } } // 测试无效对象:传入不存在的对象类型,验证异常抛出 @isTest static void testGetMultiPicklistValues_InvalidObject() { try { LeadController.getMultiPicklistValues('Invalid_Object__c', 'AnyField__c'); System.assert(false, '传入不存在的对象时应抛出异常'); } catch (Exception e) { System.assert(e instanceof NullPointerException || e.getMessage().contains('Attempt to de-reference a null object'), '抛出的异常类型不符合预期'); } } // 测试无效字段:传入存在的对象但不存在的字段,验证异常抛出 @isTest static void testGetMultiPicklistValues_InvalidField() { try { LeadController.getMultiPicklistValues('Lead', 'Invalid_Field__c'); System.assert(false, '传入不存在的字段时应抛出异常'); } catch (Exception e) { System.assert(e instanceof NullPointerException || e.getMessage().contains('Attempt to de-reference a null object'), '抛出的异常类型不符合预期'); } } // 测试非多选项字段:传入非多选项类型的字段,验证异常抛出 @isTest static void testGetMultiPicklistValues_NonPicklistField() { try { // 传入Lead的Name字段(文本类型,非多选项) LeadController.getMultiPicklistValues('Lead', 'Name'); System.assert(false, '传入非多选项字段时应抛出异常'); } catch (Exception e) { System.assert(e instanceof SObjectException || e.getMessage().contains('Method does not exist or incorrect signature'), '抛出的异常类型不符合预期'); } } }
关键测试逻辑说明
有效输入验证:
- 调用待测试方法后,通过Schema描述获取该字段的实际选项值,排序后与返回结果逐一对比,确保返回值准确且已排序。
- 验证返回列表非空、长度匹配,避免方法逻辑错误导致的空值或缺失选项。
异常场景验证:
- 针对不存在的对象、不存在的字段、非多选项字段三种异常情况,验证方法会抛出预期的异常,确保边界场景下的稳定性。
注意事项
- 测试代码中的
Custom_MultiPicklist__c需要替换为你Org中Lead对象实际存在的多选项字段API名,否则测试会失败。 - 原方法未做异常捕获处理,因此异常场景测试中需要捕获对应的NullPointerException或SObjectException。
内容的提问来源于stack exchange,提问作者Klosmi
相关产品推荐
相关产品推荐

