Implementing Mocking for Apex Tests
Trying to mock a actual database query can be hard. Using the fflib_Mocks jar you can generator Selector Mocks: More info here:
https://github.com/financialforcedev/fflib-apex-mocks
1. Create interface class that extends fflib_ISObjectSelector to mock the Selector
2. Create interfacemocks.properties file in root of your project
3. Run java -jar apex-mocks-generator-4.0.0.jar “{path}/src/classes” “{path}/interfacemocks.properties” “fflib_Mocks” “{path}/src/classes” “30.0” to generate mocking files
4. Used mocked selector to write stub selector
5. Run mock generator as maven job
1. Create interface class that extends fflib_ISObjectSelector to mock the Selector
public interface System_Selector extends fflib_ISObjectSelector {
List<Object> selectByUserId(Id userId);
}
2. Create interfacemocks.properties file in root of your project
System_Selector=Contact:fflib_SObjectMocks.SObjectSelector
3. Run java -jar apex-mocks-generator-4.0.0.jar "{path}/src/classes" "{path}/interfacemocks.properties" "fflib_Mocks" "{path}/src/classes" "30.0" to generate mocking files
/* Generated by apex-mocks-generator version 4.0.1 */
@isTest
public class Selector_Mocks{
public class Contact extends fflib_SObjectMocks.SObjectSelector implements System_Selector{
private fflib_ApexMocks mocks;
public Contact(fflib_ApexMocks mocks){
super(mocks);
this.mocks = mocks;
}
public List<Object> selectByUserId(Id userId){
return (List<Object>) mocks.mockNonVoidMethod(this, 'selectByUserId', new List<Type> {System.Type.forName('Id')}, new List<Object> {userId});
}
}
}
4. Used mocked selector to write stub selector
@isTest static void testContactSelector(){
// Create mocks
fflib_ApexMocks mocks = new fflib_ApexMocks();
fflib_ISObjectUnitOfWork uowMock = new fflib_SObjectMocks.SObjectUnitOfWork(mocks);
System_Selector selectorMock = new System_Mocks.Contact(mocks);
// Given
mocks.startStubbing();
List<Contact> testContactList = new List<Contact> {
new Contact(
Id = fflib_IDGenerator.generate(Contact.SObjectType),
FirstName = 'Test FirstName',
LastName = 'Test LastName',
Email = 'test@mail.com') };
Set<Id> testContactSet = new Map<Id, Contact>(testContactList).keySet();
User testUserId = new User( Id = fflib_IDGenerator.generate(User.SObjectType),
FirstName = 'Test FirstName',
LastName = 'Test LastName',
Email = 'test@mail.com' );
mocks.when(selectorMock.sObjectType()).thenReturn(Contact.SObjectType);
mocks.when(selectorMock.selectByUserId(testUserId.Id)).thenReturn(testContactList);
mocks.stopStubbing();
System_Rest_App.Selector.setMock(selectorMock);
// When
new System_Mocks.Contact(mocks).selectByUserId(testUserId.Id);
// Then
((System_Selector)
mocks.verify(selectorMock)).selectByUserId(testUserId.Id);
}
5. Run mock generator as maven job - ant generate.mocks
<target name="generate.mocks">
<java classname="com.financialforce.apexmocks.ApexMockGenerator">
<classpath>
<pathelement location="${basedir}/lib/apex-mocks-generator-4.0.1.jar"/>
</classpath>
<arg value="${basedir}/src/classes"/>
<arg value="${basedir}/interfacemocks.properties"/>
<arg value="Selector_Mocks"/>
<arg value="${basedir}/src/classes"/>
</java>
</target>
___123___Implementing Mocking for Apex Tests | Thys Michels Blog___123___