Mock SOQL Tests for Data Cloud Data Model Objects
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.
The SOQL query must be against a DMO or an external object, either directly with a FROM clause or via a subquery. If you query against a stubbed object type that doesn’t include a DMO or an external object, the error Stubbed query invocations can't be used without a participating query stub set. is thrown.
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.
1@IsTest
2public class SkyMilesForBusinessOptInController_Test {
3
4 @IsTest
5 public static void mockSoql() {
6
7 SoqlStubProvider stub = new UnifiedIndividualSoqlStub();
8 Test.createSoqlStub(UnifiedIndividual__dlm.sObjectType, stub);
9
10 Assert.isTrue(Test.isSoqlStubDefined(UnifiedIndividual__dlm.sObjectType));
11
12 Test.startTest();
13 string companyId = 'SampleCompanyId';
14 // Performs SOQL query against Data Model Object
15 List<SkyMilesMember> members = SkyMilesForBusinessOptInController.getSkyMilesProfilesFromDataCloud(companyId);
16
17 Test.stopTest();
18
19 Assert.areEqual(1, members.size());
20
21 SkyMilesMember member = members[0];
22
23 Assert.areEqual(companyId, member.CompanyId);
24 Assert.areEqual(5000, member.SkyMilesBalance);
25 }
26
27 class UnifiedIndividualSoqlStub extends SoqlStubProvider {
28 public override List<sObject> handleSoqlQuery(sObjectType sot, string stubbedQuery, Map<string, object> bindVars) {
29
30 Assert.areEqual(UnifiedIndividual__dlm.sObjectType, sot);
31
32 // Stub assumes that the SOQL query is searching for a single record by company id
33
34 string companyId = 'Default';
35 if(bindVars.containsKey('tmpVar1')) {
36 companyId = (string)bindVars.get('tmpVar1');
37 }
38
39 UnifiedIndividual__dlm dmo = (UnifiedIndividual__dlm)Test.createStubQueryRow(
40 sot,
41 new Map<string, object> {
42 'ssot__FirstName__c' => 'Codey',
43 'ssot__LastName__c' => 'Bear',
44 'ssot__Email__c' => 'developer@salesforce.com',
45 'ssot__SkyMilesBalance__c' => 5000,
46 'ssot__MedallionStatus__c' => 'Gold',
47 'ssot__CompanyId__c' => companyId
48 }
49 );
50 return new List<sObject> { dmo };
51
52 }
53 }
54}1public with sharing class SkyMilesForBusinessOptInController {
2 public static List<SkyMilesMember> getSkyMilesProfilesFromDataCloud(String companyId) {
3 List<UnifiedIndividual__dlm> unifiedIndividuals = [
4 SELECT
5 Id,
6 ssot__FirstName__c,
7 ssot__LastName__c,
8 ssot__Email__c,
9 ssot__SkyMilesBalance__c,
10 ssot__MedallionStatus__c,
11 ssot__CompanyId__c
12 FROM UnifiedIndividual__dlm
13 WHERE ssot__CompanyId__c = :companyId
14 ];
15 List<SkyMilesMember> skyMilesMembers = new List<SkyMilesMember>();
16 for (UnifiedIndividual__dlm individual : unifiedIndividuals) {
17 skyMilesMembers.add(
18 new SkyMilesMember(
19 individual.Id,
20 individual.ssot__FirstName__c,
21 individual.ssot__LastName__c,
22 individual.ssot__Email__c,
23 individual.ssot__SkyMilesBalance__c,
24 individual.ssot__MedallionStatus__c,
25 individual.ssot__CompanyId__c
26 )
27 );
28 }
29 return skyMilesMembers;
30 }
31}
32
33
34
35