Skip to content

Build

Build in-memory SObject records without database operations.

Methods

MethodDescription
set(SObjectField, Object)Set field value using field token
set(String, Object)Set field value (supports dot notation for parents)
setChildren(String, List)Set child relationship records
setFakeId()Generate and set a fake ID
build()Build single mock record
build(Integer)Build multiple mock records

set (SObjectField)

Set a field value using the SObjectField token.

Signature

apex
Mocker set(SObjectField field, Object value);

Test Lib

apex
Account acc = (Account) AccountTestModule.Mocker()
    .set(Account.Name, 'Mock Account')
    .set(Account.Industry, 'Technology')
    .build();

set (String)

Set a field value using a string field name. Supports dot notation for parent relationships.

Signature

apex
Mocker set(String field, Object value);

Simple Field

apex
Account acc = (Account) AccountTestModule.Mocker()
    .set('Name', 'Mock Account')
    .set('Industry', 'Technology')
    .build();

Parent Relationship

apex
Account acc = (Account) AccountTestModule.Mocker()
    .set('Parent.Name', 'Parent Corporation')
    .build();

// acc.Parent.Name == 'Parent Corporation'

Deeply Nested

apex
Contact con = (Contact) ContactTestModule.Mocker()
    .set('Account.Parent.Name', 'Grandparent Corp')
    .build();

// con.Account.Parent.Name == 'Grandparent Corp'

Read-Only Fields

Mocker can set fields that are normally read-only in Apex.

apex
Account acc = (Account) AccountTestModule.Mocker()
    .setFakeId()
    .set('CreatedDate', Datetime.newInstance(2025, 1, 15, 10, 30, 0))
    .set('Owner.Name', 'System Admin')
    .build();

Assert.areEqual('System Admin', acc.Owner.Name);

TIP

Use dot notation to mock parent relationships. This is especially useful when testing code that accesses parent fields from query results.

setChildren

Set child relationship records on a mock parent.

Signature

apex
Mocker setChildren(String relationship, List<SObject> children);

Traditional Apex

apex
// Cannot mock child relationships without database queries
Account acc = [SELECT Id, (SELECT Id, LastName FROM Contacts) FROM Account WHERE Id = :accId];

Test Lib

apex
List<Contact> contacts = (List<Contact>) ContactTestModule.Mocker()
    .build(3);

Account acc = (Account) AccountTestModule.Mocker()
    .setChildren('Contacts', contacts)
    .build();

// acc.Contacts.size() == 3

Multiple Child Relationships

apex
List<Contact> contacts = (List<Contact>) ContactTestModule.Mocker().build(5);
List<Opportunity> opportunities = (List<Opportunity>) OpportunityTestModule.Mocker().build(3);

Account acc = (Account) AccountTestModule.Mocker()
    .setFakeId()
    .setChildren('Contacts', contacts)
    .setChildren('Opportunities', opportunities)
    .build();

Assert.areEqual(5, acc.Contacts.size());
Assert.areEqual(3, acc.Opportunities.size());

setFakeId

Generate and set a fake ID for the mock record.

Signature

apex
Mocker setFakeId();

Traditional Apex

apex
// Cannot create valid IDs without database insert
Account acc = new Account(Name = 'Test');
// acc.Id is null

Test Lib

apex
Account acc = (Account) AccountTestModule.Mocker()
    .setFakeId()
    .build();

// acc.Id is a valid-looking ID like 001000000000001
Assert.isNotNull(acc.Id);
Assert.isTrue(String.valueOf(acc.Id).startsWith('001'));

Unique IDs

Each call to setFakeId() generates a unique ID.

apex
Account acc1 = (Account) AccountTestModule.Mocker().setFakeId().build();
Account acc2 = (Account) AccountTestModule.Mocker().setFakeId().build();

Assert.areNotEqual(acc1.Id, acc2.Id);

TIP

Use fake IDs when testing code that requires record IDs but doesn't need actual database records, such as Map operations or trigger handlers.

build

Build a single mock record.

Signature

apex
SObject build();

Traditional Apex

apex
Account acc = new Account(Name = 'Test Account', Industry = 'Technology');
// Cannot set read-only fields like CreatedDate, formulas, etc.

Test Lib

apex
Account acc = (Account) AccountTestModule.Mocker()
    .set(Account.Name, 'Test Account')
    .set(Account.Industry, 'Technology')
    .build();

// No database operation - perfect for unit tests

build (Multiple)

Build multiple mock records.

Signature

apex
List<SObject> build(Integer amount);

Traditional Apex

apex
List<Account> accounts = new List<Account>();
for (Integer i = 0; i < 10; i++) {
    accounts.add(new Account(Name = 'Account ' + i));
}

Test Lib

apex
List<SObject> accounts = AccountTestModule.Mocker()
    .set(Account.Industry, 'Technology')
    .build(10);

When to Use Mocker

Use Mocker instead of Builder when:

  • Testing pure business logic without database
  • Testing calculations and transformations
  • Mocking query results with relationships
  • Need faster test execution (no DML overhead)
  • Need to set read-only fields (CreatedDate, formulas)

Example: Testing Business Logic

apex
@IsTest
static void testDiscountCalculation() {
    Account acc = (Account) AccountTestModule.Mocker()
        .set(Account.AnnualRevenue, 500000)
        .set(Account.Type, 'Customer')
        .build();

    Decimal discount = PricingService.calculateDiscount(acc);

    Assert.areEqual(0.15, discount);
}

TIP

Mocker creates records using JSON serialization, which allows setting read-only fields that are normally impossible to set in Apex.