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.
@IsTest public with sharing 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); } public with sharing 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 WITH USER_MODE]; 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; } }