Basic Examples
Learn HTTP Mock Lib fundamentals through practical examples.
Simple GET Request
The most basic use case - mocking a single GET endpoint:
apex
@IsTest
static void testSimpleGet() {
// Arrange
new HttpMock()
.whenGetOn('/api/users')
.body('{"id": "123", "name": "John Doe"}')
.statusCodeOk()
.mock();
// Act
Test.startTest();
UserService service = new UserService();
User result = service.getUser();
Test.stopTest();
// Assert
Assert.areEqual('John Doe', result.name);
}POST Request
Mock a POST request that creates a resource:
apex
@IsTest
static void testCreateUser() {
// Arrange
new HttpMock()
.whenPostOn('/api/users')
.body('{"id": "456", "created": true}')
.statusCodeCreated()
.mock();
// Act
Test.startTest();
UserService service = new UserService();
String userId = service.createUser('John Doe');
Test.stopTest();
// Assert
Assert.areEqual('456', userId);
}Using Objects as Bodies
Instead of JSON strings, you can pass Apex objects:
apex
@IsTest
static void testWithObjectBody() {
// Arrange
Map<String, Object> responseData = new Map<String, Object>{
'users' => new List<Map<String, String>>{
new Map<String, String>{ 'id' => '1', 'name' => 'Alice' },
new Map<String, String>{ 'id' => '2', 'name' => 'Bob' }
},
'total' => 2
};
new HttpMock()
.whenGetOn('/api/users')
.body(responseData)
.statusCodeOk()
.mock();
// Act
Test.startTest();
List<User> users = new UserService().getUsers();
Test.stopTest();
// Assert
Assert.areEqual(2, users.size());
}Multiple Endpoints
Mock several endpoints in one test:
apex
@IsTest
static void testMultipleEndpoints() {
// Arrange
new HttpMock()
.whenGetOn('/api/auth/token')
.body('{"token": "xyz123"}')
.statusCodeOk()
.whenPostOn('/api/users')
.body('{"id": "789"}')
.statusCodeCreated()
.whenDeleteOn('/api/users/789')
.statusCodeNoContent()
.mock();
// Act
Test.startTest();
UserService service = new UserService();
service.authenticate();
String userId = service.createUser('Test User');
service.deleteUser(userId);
Test.stopTest();
// Assert
Assert.isNotNull(userId);
}Custom Headers
Add custom headers to your response:
apex
@IsTest
static void testWithCustomHeaders() {
// Arrange
new HttpMock()
.whenGetOn('/api/users')
.body('{"users": []}')
.header('X-Total-Count', '100')
.header('X-Page-Number', '1')
.header('Cache-Control', 'no-cache')
.statusCodeOk()
.mock();
// Act
Test.startTest();
ApiResponse response = new UserService().getUsersWithMetadata();
Test.stopTest();
// Assert
Assert.areEqual(100, response.totalCount);
}Different Content Types
XML Response
apex
@IsTest
static void testXmlResponse() {
// Arrange
String xmlData = '<?xml version="1.0"?>' +
'<user>' +
'<id>123</id>' +
'<name>John Doe</name>' +
'</user>';
new HttpMock()
.whenGetOn('/api/user.xml')
.body(xmlData)
.contentTypeXml()
.statusCodeOk()
.mock();
// Act
Test.startTest();
User user = new UserService().getUserAsXml();
Test.stopTest();
// Assert
Assert.areEqual('123', user.id);
}CSV Response
apex
@IsTest
static void testCsvExport() {
// Arrange
String csvData = 'id,name,email\n' +
'1,John,john@example.com\n' +
'2,Jane,jane@example.com';
new HttpMock()
.whenGetOn('/api/users/export')
.body(csvData)
.contentTypeCsv()
.header('Content-Disposition', 'attachment; filename="users.csv"')
.statusCodeOk()
.mock();
// Act
Test.startTest();
String csvContent = new UserService().exportUsers();
Test.stopTest();
// Assert
Assert.isTrue(csvContent.contains('John'));
}Default Values
If you don't specify certain properties, HTTP Mock uses sensible defaults:
apex
@IsTest
static void testDefaults() {
// This mock uses all defaults:
// - Status Code: 200 (OK)
// - Content-Type: application/json
// - Body: {}
new HttpMock()
.whenGetOn('/api/ping')
.mock();
// Act
Test.startTest();
Boolean pong = new ApiService().ping();
Test.stopTest();
// Assert
Assert.isTrue(pong);
}Minimal Example
The absolute minimum needed for a mock:
apex
@IsTest
static void testMinimalMock() {
new HttpMock()
.whenGetOn('/api/status')
.mock();
Test.startTest();
new ApiService().checkStatus();
Test.stopTest();
}Tips
Call
.mock()last - Always end with.mock()to activate your configurationOne mock per test - Create a fresh HttpMock for each test method
Match real endpoints - Use the same paths your code actually calls
Use meaningful data - Test with realistic response data
