Awesome
FFLib ApexMocks Framework
ApexMocks is a mocking framework for the Salesforce Lightning Apex language.
It derives its inspiration from the well known Java mocking framework Mockito
<a href="https://githubsfdeploy.herokuapp.com?owner=apex-enterprise-patterns&repo=fflib-apex-mocks"> <img alt="Deploy to Salesforce" src="https://raw.githubusercontent.com/afawcett/githubsfdeploy/master/src/main/webapp/resources/img/deploy.png"> </a>Using ApexMocks on the Salesforce Lightning Platform
ApexMocks allows you to write tests to both verify behavior and stub dependencies.
An assumption is made that you are using some form of Dependency Injection - for example passing dependencies via a constructor:
public MyClass(ClassA.IClassA dependencyA, ClassB.IClassB dependencyB)
This allows you to pass mock implementations of dependencies A and B when you want to unit test MyClass.
Lets assume we've written our own list interface fflib_MyList.IList that we want to either verify or stub:
public class fflib_MyList implements IList
{
public interface IList
{
void add(String value);
String get(Integer index);
void clear();
Boolean isEmpty();
}
}
verify() behaviour verification
// Given
fflib_ApexMocks mocks = new fflib_ApexMocks();
fflib_MyList.IList mockList = (fflib_MyList.IList)mocks.mock(fflib_MyList.class);
// When
mockList.add('bob');
// Then
((fflib_MyList.IList) mocks.verify(mockList)).add('bob');
((fflib_MyList.IList) mocks.verify(mockList, fflib_ApexMocks.NEVER)).clear();
If the method wasn't called the expected number of times, or with the expected arguments, verify will throw an exception. The exception message contains details of the expected and actual invocations:
EXPECTED COUNT: 1
ACTUAL COUNT: 0
METHOD: EmailService__sfdc_ApexStub.sendTo(String)
---
ACTUAL ARGS: ("user-two@example.com")
---
EXPECTED ARGS: [[contains "user-one"]]
when() dependency stubbing
fflib_ApexMocks mocks = new fflib_ApexMocks();
fflib_MyList.IList mockList = (fflib_MyList.IList)mocks.mock(fflib_MyList.class);
mocks.startStubbing();
mocks.when(mockList.get(0)).thenReturn('bob');
mocks.when(mockList.get(1)).thenReturn('fred');
mocks.stopStubbing();
Utilties
Setting a read-only field, such as a formula
Account acc = new Account();
Integer mockFormulaResult = 10;
acc = (Account)fflib_ApexMocksUtils.setReadOnlyFields(
acc,
Account.class,
new Map<SObjectField, Object> {Account.Your_Formula_Field__c => mockFormulaResult}
);
System.assertEquals(mockFormulaResult, acc.Your_Formula_Field__c);
Stub API
Using Salesforce's Stub API, stub objects are generated dynamically at run time.
fflib_ApexMocks mocks = new fflib_ApexMocks();
fflib_MyList mockList = (fflib_MyList)mocks.mock(fflib_MyList.class);
Documentation
- ApexMocks Framework Tutorial
- Simple Dependency Injection
- ApexMocks Generator
- Behaviour Verification
- Stubbing Dependencies
- Supported Features
- New Improved apex-mocks-generator
- ApexMocks Improvements - exception stubbing, base classes and more
- Matchers
- ApexMock blogs from Jesse Altman
- Order of calls verification
- Answering
- Counters
- Troubleshooting