Skip to content

v1.3.0 - 17-August-2026

Scope

  • New Features: Exception Throwing, Request Capture, Per-Method Request Assertions, Status Text
  • Improvements: Simplified Internals, Dedicated Package Source, API v67.0

HttpMock

  • Added throwsException(Exception error) and throwsException() for simulating failed callouts
  • Added captured() and last() for asserting on the requests your code actually sent
  • Added per-method variants: capturedGets()capturedHeads() and lastGet()lastHead()
  • Added status() for setting the response status text
  • Split package source: the unlocked package builds from a dedicated package/ directory (global), while force-app/ is declared public for source deploys

New Features

Exception Throwing

A mocked endpoint can now fail on the wire instead of returning a response — the way a real callout fails when the connection drops or the read times out. The exception takes its position in the response queue, so retries can be tested turn by turn: succeed, fail, recover.

apex
new HttpMock()
    .whenGetOn('/api/v1').statusCodeOk()
    .whenGetOn('/api/v1').throwsException(new CalloutException('Connection reset'))
    .whenGetOn('/api/v1').statusCodeOk()
    .mock();

The no-argument overload throws a default CalloutException:

apex
new HttpMock()
    .whenPostOn('/api/v1')
    .throwsException()
    .mock();

A callout that throws still counts as a request — it was sent.

See Exceptions for details.

Request Capture

requestsTo() no longer only counts — it hands you the actual HttpRequest objects your code sent, in the order they were made:

apex
List<HttpRequest> sent = HttpMock.requestsTo('/api/v1').captured();
HttpRequest lastSent = HttpMock.requestsTo('/api/v1').last();

Assert.areEqual('{"name":"Jane"}', lastSent.getBody(), 'Body should carry the name');

Per-Method Request Assertions

Every capture and last-request lookup comes in a per-method variant, for endpoints that serve several verbs:

apex
HttpMock.requestsTo('/api/v1').capturedPosts(); // all POSTs, in the order sent
HttpMock.requestsTo('/api/v1').lastGet();       // the most recent GET, or null

Available for GET, POST, PUT, PATCH, DELETE, TRACE, and HEAD. See Requests for details.

Status Text

status() sets the response status text, read by getStatus():

apex
new HttpMock()
    .whenGetOn('/api/v1')
    .statusCodeServiceUnavailable()
    .status('Service Unavailable')
    .mock();

Improvements

Simplified Internals

The implementation was slimmed down with no change in behavior: dead code and redundant state removed, duplicated map bookkeeping collapsed with the null-coalescing operator, request counts derived from the captured requests instead of a separate counter map, and single-use helpers inlined. Verified against the full test suite.

Dedicated Package Source

The btcdev unlocked package now builds from a dedicated package/ directory, where HttpMock is declared global for cross-namespace access. The force-app/ source used for direct deploys and copy-paste installs declares the class public.

API Version Update

Updated Salesforce API version from 65.0 to 67.0.


v1.2.0 - 26-December-2025

Scope

  • New Features: Static Resource Support, Enhanced Request Assertions API
  • Improvements: Global Access Modifier, Parallel Test Execution, Unlocked Package Support

HttpMock

  • Added staticResource() method for loading response body from Static Resources
  • Added requestsTo() method with fluent assertion API for request counting
  • Changed class access from public to global for managed package support
  • Added unlocked package distribution with btcdev namespace

New Features

Static Resource Support

New staticResource() method allows loading response body directly from a Salesforce Static Resource. This is ideal for large or complex response payloads that are difficult to maintain inline.

Example: Mock Using Static Resource

apex
new HttpMock()
    .whenGetOn('/api/v1/users')
    .staticResource('UsersResponseMock')
    .statusCodeOk()
    .mock();

If the Static Resource doesn't exist, a StaticResourceNotFoundException is thrown with a clear error message.

Enhanced Request Assertions API

New requestsTo() method provides a fluent API for asserting the number of HTTP requests made during a test. This replaces the previous getRequestCount() method with a more intuitive interface.

Example: Assert Request Counts

apex
new HttpMock()
    .whenGetOn('/api/v1/authorize')
    .statusCodeOk()
    .whenPostOn('/api/v1/create')
    .statusCodeOk()
    .mock();

Test.startTest();
// Make callouts...
Test.stopTest();

Assert.areEqual(1, HttpMock.requestsTo('/api/v1/authorize').get(), 'One GET request should be made');
Assert.areEqual(1, HttpMock.requestsTo('/api/v1/create').post(), 'One POST request should be made');

Supported Assertion Methods

apex
HttpMock.requestsTo('/endpoint').all();     // Total requests (all methods)
HttpMock.requestsTo('/endpoint').get();     // GET requests
HttpMock.requestsTo('/endpoint').post();    // POST requests
HttpMock.requestsTo('/endpoint').put();     // PUT requests
HttpMock.requestsTo('/endpoint').patch();   // PATCH requests
HttpMock.requestsTo('/endpoint').deletex(); // DELETE requests (x suffix due to reserved keyword)
HttpMock.requestsTo('/endpoint').trace();   // TRACE requests
HttpMock.requestsTo('/endpoint').head();    // HEAD requests

Improvements

Global Access Modifier

The HttpMock class is now declared as global instead of public, enabling usage in managed and unlocked packages.

Parallel Test Execution

Test class now includes @IsTest(IsParallel=true) for faster test execution.

Unlocked Package Support

HTTP Mock Lib is now available as an unlocked package with the btcdev namespace. See the Installation Guide for package installation instructions.

API Version Update

Updated Salesforce API version from 57.0 to 65.0.

Internal Refactoring

  • Renamed interface from HttpMockLib to HttpStubbing
  • All fluent methods now return HttpStubbing interface type
  • Introduced HttpMockRequests inner class for improved request counting
  • Refactored request tracking from method-based to endpoint-based storage
  • Added PMD suppressions for FieldDeclarationsShouldBeAtStart, CognitiveComplexity, CyclomaticComplexity

🚨 Breaking Changes 🚨

Request Count API Change

The getRequestCount() static method has been replaced with the new requestsTo() API.

Before (v1.1.x):

apex
Assert.areEqual(2, HttpMock.getRequestCount('GET', '/api/v1'));

After (v1.2.0):

apex
Assert.areEqual(2, HttpMock.requestsTo('/api/v1').get());

Interface Rename

The public interface has been renamed from HttpMockLib to HttpStubbing. This only affects code that explicitly references the interface type (uncommon).