Mock SOQL Tests for Data Cloud Data Model Objects

You can mock SOQL query responses for Data Cloud data model objects (DMOs) in Apex testing by using the new SOQL stub methods and a new test class. Use static or dynamic SOQL queries against DMOs and return mock records in a testing context.

Create mock test classes by extending the new System.SoqlStubProvider class and overriding the handleSoqlQuery() class method. Create DMO instances using either Test.createStubQueryRow() or Test.createStubQueryRows(). Register the mock provider in the test using Test.createSoqlStub() and execute the test code.

Apex governor limits apply to the stubbed records.

Note

The SOQL query must be against a DMO, either directly with a FROM clause or via a subquery. Also, these features are not allowed within a stub implementation:

  • SOQL
  • SOSL
  • Callouts
  • Future methods
  • Queueable Jobs
  • Batch Jobs
  • DML
  • Platform Events

This example shows a mock test class for the SkyMilesForBusinessOptInController class.

@IsTest
public class SkyMilesForBusinessOptInController_Test {

    @IsTest
    public static void mockSoql() {
    
        SoqlStubProvider stub = new UnifiedIndividualSoqlStub();
        Test.createSoqlStub(UnifiedIndividual__dlm.sObjectType, stub);

        Assert.isTrue(Test.isSoqlStubDefined(UnifiedIndividual__dlm.sObjectType));
        
        Test.startTest();
        string companyId = 'SampleCompanyId';
        // Performs SOQL query against Data Model Object
        List<SkyMilesMember> members = SkyMilesForBusinessOptInController.getSkyMilesProfilesFromDataCloud(companyId);
        
        Test.stopTest();
        
        Assert.areEqual(1, members.size());
        
        SkyMilesMember member = members[0];
        
        Assert.areEqual(companyId, member.CompanyId);
        Assert.areEqual(5000, member.SkyMilesBalance);
    }
    
    class UnifiedIndividualSoqlStub extends SoqlStubProvider {
        public override List<sObject> handleSoqlQuery(sObjectType sot, string stubbedQuery, Map<string, object> bindVars) {
        
            Assert.areEqual(UnifiedIndividual__dlm.sObjectType, sot);
            
            // Stub assumes that the SOQL query is searching for a single record by company id

            string companyId = 'Default';
            if(bindVars.containsKey('tmpVar1')) {
                companyId = (string)bindVars.get('tmpVar1');
            }
                     
            UnifiedIndividual__dlm dmo = (UnifiedIndividual__dlm)Test.createStubQueryRow(
                sot, 
                new Map<string, object> {
                    'ssot__FirstName__c' => 'Codey',
                    'ssot__LastName__c' => 'Bear',
                    'ssot__Email__c' => 'developer@salesforce.com',
                    'ssot__SkyMilesBalance__c' => 5000,
                    'ssot__MedallionStatus__c' => 'Gold',
                    'ssot__CompanyId__c' => companyId
                  } 
            );           
            return new List<sObject> { dmo };

        }
    }
}
public with sharing class SkyMilesForBusinessOptInController {
    public static List<SkyMilesMember> getSkyMilesProfilesFromDataCloud(String companyId) {
        List<UnifiedIndividual__dlm> unifiedIndividuals = [
          SELECT
            Id,
            ssot__FirstName__c,
            ssot__LastName__c,
            ssot__Email__c,
            ssot__SkyMilesBalance__c,
            ssot__MedallionStatus__c,
            ssot__CompanyId__c
          FROM UnifiedIndividual__dlm
          WHERE ssot__CompanyId__c = :companyId
        ];
        List<SkyMilesMember> skyMilesMembers = new List<SkyMilesMember>();
        for (UnifiedIndividual__dlm individual : unifiedIndividuals) {
          skyMilesMembers.add(
            new SkyMilesMember(
              individual.Id,
              individual.ssot__FirstName__c,
              individual.ssot__LastName__c,
              individual.ssot__Email__c,
              individual.ssot__SkyMilesBalance__c,
              individual.ssot__MedallionStatus__c,
              individual.ssot__CompanyId__c
            )
          );
        }
        return skyMilesMembers;
    }
}