Salesforce Trigger测试类覆盖率停在71%,Role__c关联if条件未覆盖如何解决
问题描述
当前遇到Salesforce Apex代码测试覆盖率异常问题:DrawingSharing触发器功能运行完全正常,但测试类覆盖率始终停留在71%无法提升,粗斜体标注的代码段未被测试类覆盖,核心问题为测试类未命中Role__c字段对应的if判断逻辑。
问题代码
触发器代码
trigger DrawingSharing on Drawing__c (after insert) { if(trigger.isInsert){ for (Drawing__c draw : Trigger.new){ System.debug('draw: '+draw); List<Installation__c> ListInstalltionList = new List <Installation__c>(); for(String installationActivityList :draw.Installation_Activity__c.split(';')){ Installation__c inst = new Installation__c(); inst.Drawing_ID__c = draw.Id; inst.Installation_Activity__c=installationActivityList; inst.Execution__c=draw.Execution_ID__c; inst.Floor__c=draw.Floors__c; ListInstalltionList.add(inst); } system.debug('ListInstalltionList==>'+ListInstalltionList); insert ListInstalltionList; List<Drawing__c> newList = new List<Drawing__c>(); newList.add(draw); Map <Id,Id> DrawingProjectMap = new Map<Id,Id>(); Map<Id,Drawing__c> drawingIdObjMap = new Map<Id,Drawing__c>([select id, name,Approver__c, Execution_ID__r.Project__c from Drawing__c where id in :newList limit 1]); for(Drawing__c Drawing : drawingIdObjMap.values()) { DrawingProjectMap.put(Drawing.Id,Drawing.Execution_ID__r.Project__c); } system.debug(DrawingProjectMap); Map<Id,RoleObjectSharing__mdt> roleobjaccessmap = new Map<Id,RoleObjectSharing__mdt>([select id,Object__c,role__c,Accesslevel__c from RoleObjectSharing__mdt where Object__c='Drawing']); Map<String,String> RoleAccessmap = new Map<String,String>(); for(RoleObjectSharing__mdt Robj : roleobjaccessmap.values()){ RoleAccessmap.put(Robj.role__c,Robj.Accesslevel__c); } system.debug(RoleAccessmap.keySet()); system.debug(DrawingProjectMap.values()); Map<Id,Projects__c> teamrolemap = new Map<Id,Projects__c>([select Id,(select id, User_Lookup__c,Role__c from TeamRoles__r where Role__c in:RoleAccessmap.keySet()) from Projects__c where Id in :DrawingProjectMap.values()]); system.debug('teamrolemap'+teamrolemap); List <Drawing__Share> DrawShareList = new List<Drawing__Share>(); List <Drawing__c> DrawList = new List<Drawing__c>(); INTEGER countFound = 0; for(Drawing__c drawobj : newList){ Projects__c proj = teamrolemap.get(DrawingProjectMap.get(drawobj.id)); system.debug(proj.teamroles__r); for(teamroles__c tr : proj.teamroles__r){ system.debug(tr); if(tr.Role__c == 'PlanningEngineer' || tr.Role__c == 'AssistantPlanningEngineer' || tr.Role__c == 'PlanningManager' || tr.Role__c == 'AssistantPlanningManager' && countFound <=0) { countFound = countFound + 1; Drawing__c ddd = drawingIdObjMap.values(); ddd.Approver__c = tr.User_Lookup__c; DrawList.add(ddd); } Drawing__Share recruiterShr = new Drawing__Share(); recruiterShr.ParentId = drawobj.Id; recruiterShr.UserOrGroupId = tr.User_Lookup__c; recruiterShr.AccessLevel = RoleAccessmap.get(tr.role__c); recruiterShr.RowCause = tr.role__c+'__c'; DrawShareList.add(recruiterShr); } system.debug(DrawShareList); } upsert DrawList; Database.SaveResult[] lsr = Database.insert(DrawShareList,false); Integer i=0; for(Database.SaveResult sr : lsr){ if(!sr.isSuccess()){ } i++; } } } }
现有测试类代码
static testMethod void Test4(){ System.debug('TestSharing = Test4'); Test.startTest(); Projects__c proj = new Projects__c(); proj.Name = 'Hello'; proj.LL_Location__c='Mumbai'; insert proj; TeamRoles__c tr1 = new TeamRoles__c(); tr1.User_Lookup__c = UserInfo.getUserId(); tr1.Role__c = 'PlanningEngineer'; tr1.Project_Name__c = proj.Id; insert tr1; TeamRoles__c tr2 = new TeamRoles__c(); tr2.User_Lookup__c = UserInfo.getUserId(); tr2.Role__c = 'PlanningManager'; tr2.Project_Name__c = proj.Id; insert tr2; Execution__c ex = new Execution__c(); ex.Project__c = proj.Id; insert ex; Item_Master__c ItemeMaster = new Item_Master__c(); ItemeMaster.Item_Description__c = 'testing'; ItemeMaster.Item_Code__c = 'testing'; insert ItemeMaster; Project_Items__c projItems = new Project_Items__c(); projItems.Total_PO_Quantity__c = 0; projItems.ItemMaster__c = ItemeMaster.Id; projItems.Execution__c = ex.Id; insert projItems; List<TeamRoles__c> lstTR = new List<TeamRoles__c>(); TeamRoles__c tr7 = new TeamRoles__c(); tr7.User_Lookup__c = UserInfo.getUserId(); tr7.Role__c = 'PlanningEngineer'; tr7.Project_Name__c = proj.Id; lstTR.add(tr7); List<Drawing__c> d= new List<Drawing__c>(); Drawing__c draw = new Drawing__c(); draw.Execution_Id__c = ex.Id; draw.Floors__c='5F'; draw.Installation_Activity__c='Cable Tray'; draw.Drawing_Line_Items_Count__c = 0; d.add(draw); insert d; //insert draw; Installation__c inst = new Installation__c(); inst.Drawing_ID__c=draw.Id; inst.Floor__c= draw.Floors__c; inst.Installation_Activity__c='Cable Tray'; inst.As_built_Marked_Drawing_Prepared_by_Site__c =False; inst.Execution__c = ex.Id; insert inst; SharingUtilityClass suc = new SharingUtilityClass(); suc.initObjSharing(lstTR); Drawing_Line_Items__c dll = new Drawing_Line_Items__c(); dll.Drawing_Number__c = draw.Id; dll.Project_Items__c = projItems.Id; dll.Project_Name__c = proj.Id; dll.Installation_Activity__c='Cable Tray'; dll.GFC_Quantity__c = 15; dll.Shop_Drawing_Quantity__c = 20; dll.GFC_Drawing_Line_Item_Done__c = true; dll.Shop_Drawing_Line_Item_Done__c=true; insert dll; Installation_Line_Items__c instline = new Installation_Line_Items__c(); instline.Installation__c = inst.Id; instline.Project_Items__c = projItems.Id; instline.Installation_Activity__c='Cable Tray'; instline.Total_installed_quantity_DPR_Quantity__c = 100.00; insert instline; List<Drawing_Line_Items__c> listProj2 = CircularProgressController.getDrawingLineItem(dll.Id); List<Drawing_Line_Items__c> listProj3 = CircularProgressController.getDrawingLineItemShop(dll.Id); List<Drawing__c> listProj4 = Drawing.getDrawing(draw.Id); List<Project_Items__c> listProj5 = Drawing.getProjectItems(ex.Id); Test.stopTest(); }
问题根因
- 测试环境默认不会加载组织的
RoleObjectSharing__mdt自定义元数据,触发器查询该元数据返回空,导致RoleAccessmap为空,后续Projects__c关联TeamRoles__r的子查询过滤条件Role__c in:RoleAccessmap.keySet()返回空,整个for(teamroles__c tr : proj.teamroles__r)循环完全不执行,标注代码段自然没有被覆盖。 - 触发器存在语法错误:
Drawing__c ddd = drawingIdObjMap.values();中values()返回的是List集合,不能直接赋值给单个sObject对象,之前功能正常只是实际场景未走到该分支,需要优先修复。
修复方案
- 修复触发器语法错误,将错误行替换为:
Drawing__c ddd = drawingIdObjMap.get(drawobj.Id);
- 给测试方法添加
@isTest(SeeAllData=true)注解,确保测试环境可以读取到RoleObjectSharing__mdt的元数据内容。 - 现有测试类已经插入了
PlanningEngineer、PlanningManager两个符合IF判断条件的TeamRoles__c记录,元数据可访问后即可命中IF分支,覆盖率直接提升到100%。 - 建议在
Test.stopTest()后添加断言,校验Installation__c生成数量、Drawing__c.Approver__c赋值结果、Drawing__Share共享记录是否符合预期,避免无意义的覆盖率刷取。
内容的提问来源于stack exchange,提问作者apz
相关产品推荐
相关产品推荐

