Salesforce APEX REST单元测试查询Case对象返回空结果问题排查
解决Apex单元测试中Case查询为空的权限与数据问题
首先得戳破最核心的问题:你的测试环境里根本没有要查询的Case记录!
Salesforce的单元测试完全运行在隔离的测试沙箱中,不会读取生产/沙箱的真实业务数据。你硬编码查询CaseNumber = '00001026'的Case,但这个记录在测试环境里不存在,返回空列表是必然结果。权限问题是次要的,先解决数据问题,再调整权限配置。
一、先补上测试数据(最关键一步)
在测试方法中手动创建测试用的Case记录,并且确保测试用户能访问它。比如:
// 在测试方法开头添加:创建测试Case Case testCase = new Case( Status = 'New', // 必填字段,根据你的Org配置调整 Origin = 'Email', Subject = 'Test Case for API', OwnerId = UserInfo.getUserId() // 先临时用当前测试运行用户 ); insert testCase;
二、权限配置的正确姿势
你用了System.RunAs()但没生效,可能有这几个原因:
- Profile权限不足:检查
StandardTestUser这个Profile是否拥有Case对象的Read权限,以及Id、CaseNumber字段的Read权限(这俩通常默认开放,但最好去Profile的字段权限里确认)。如果需要跨用户访问Case,给这个Profile加上View All Cases权限。 - 测试用户无法访问测试Case:如果Profile没有
View All权限,记得把测试Case的Owner改成RunAs里的测试用户,确保用户对这条记录有访问权:System.RunAs(pu) { testCase.OwnerId = pu.Id; update testCase; // 后续的REST请求和查询逻辑... }
三、修复后的完整测试代码示例
@isTest private class MyRestResource1Test { static testMethod void MyRestRequest() { // 1. 创建测试用Case(测试环境无真实数据,必须手动生成) Case testCase = new Case( Status = 'New', Origin = 'Phone', Subject = 'API Test Case' ); insert testCase; // 2. 创建测试用户 String uniqueUserName = 'standarduser' + DateTime.now().getTime() + '@testorg.com'; Profile p = [SELECT Id FROM Profile WHERE Name='StandardTestUser']; User pu = new User( Alias='standt', Email='standarduser@testorg.com', LastName='testing', EmailEncodingKey='UTF-8', LanguageLocaleKey='en_US', LocaleSidKey='en_US', ProfileId=p.Id, TimeZoneSidKey='America/New_York', UserName=uniqueUserName ); insert pu; System.RunAs(pu) { // 确保测试用户拥有该Case的访问权 testCase.OwnerId = pu.Id; update testCase; // 3. 构造REST请求 RestRequest req = new RestRequest(); RestResponse res = new RestResponse(); req.requestURI = '/services/apexrest/sfcheckap/'; req.addParameter('useremail','testuserid@red.com'); req.addParameter('casenumber', testCase.CaseNumber); // 用测试Case的真实编号 req.httpMethod = 'GET'; RestContext.request = req; RestContext.response = res; Test.startTest(); Map<String, Boolean> resultMap = MyRestResource1.doGet(); Test.stopTest(); // 4. 断言验证 Boolean debugflag = resultMap.get('accessPermission'); System.assert(debugflag, 'Access permission should be granted for test case'); } } }
四、你关心的其他问题解答
是否与Tooling API相关?
完全无关。Tooling API是用来操作Salesforce元数据(比如修改Profile、创建Apex类)的工具,你的问题是测试数据隔离和对象权限的基础问题,和Tooling API没有任何关联。如何配置单元测试对Case及字段的读取权限?
- 给测试用户的Profile分配Case对象的Read权限;
- 确保Profile对Case的Id、CaseNumber字段有Read权限(通常默认开启,可在Profile的字段权限设置中确认);
- 如果需要跨用户访问Case,给Profile添加
View All Cases权限,或者将测试Case的Owner设置为测试用户。
内容的提问来源于stack exchange,提问作者Claude Falbriard
相关产品推荐
相关产品推荐

