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

如何为获取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'), '抛出的异常类型不符合预期');
        }
    }
}

关键测试逻辑说明

  1. 有效输入验证:

    • 调用待测试方法后,通过Schema描述获取该字段的实际选项值,排序后与返回结果逐一对比,确保返回值准确且已排序。
    • 验证返回列表非空、长度匹配,避免方法逻辑错误导致的空值或缺失选项。
  2. 异常场景验证:

    • 针对不存在的对象、不存在的字段、非多选项字段三种异常情况,验证方法会抛出预期的异常,确保边界场景下的稳定性。

注意事项

  • 测试代码中的Custom_MultiPicklist__c需要替换为你Org中Lead对象实际存在的多选项字段API名,否则测试会失败。
  • 原方法未做异常捕获处理,因此异常场景测试中需要捕获对应的NullPointerException或SObjectException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:45:30