Apex class to lookup record types and cache them
private static Map<Schema.SObjectType,Map<String,Id>> rtypesCache; static { rtypesCache = new Map<Schema.SObjectType,Map<String,Id>>();//convenient map, formatted from r esults. } public static Map<String, Id> getRecordTypeMapForObjectGeneric(Schema.SObjectType token) { Map<String, Id> mapRecordTypes = rtypesCache.get(token); if (mapRecordTypes == null) { mapRecordTypes = new Map<String, Id>(); rtypesCache.put(token,mapRecordTypes); } else { return mapRecordTypes; } Schema.DescribeSObjectResult obj = token.getDescribe(); if (results == null || results.isEmpty()) { String soql = 'SELECT Id, Name, DeveloperName, sObjectType FROM RecordType WHERE IsActive = TRUE'; try { results = Database.query(soql); } catch (Exception ex) { results = new List<SObject>(); } } Map<Id,Schema.RecordTypeInfo> recordTypeInfos = obj.getRecordTypeInfosByID(); for (SObject rt : results) { if (recordTypeInfos.get(rt.Id) != null) { if (recordTypeInfos.get(rt.Id).isAvailable()) { mapRecordTypes.put(String.valueOf(rt.get('DeveloperName')),rt.Id); } else { System.debug('The record type ' + rt.get('DeveloperName') + ' for object ' + rt.get('sObjectType') + ' is not availiable for the user.'); } } } return mapRecordTypes; }
Test Class
@isTest(SeeAllData=true) static void testGetRecordTypeMapForObjectGeneric(){ Test.startTest(); Map<String, Id> caseRecordTypeId = App_Service.getRecordTypeMapForObjectGeneric(Case.SobjectType); System.Assert(caseRecordTypeId.get('Error')!=null); System.Assert(caseRecordTypeId.get('Internal')==null); Test.stopTest(); }