Get Started

Wire ReṼoman into your JVM project, then run your first API-Graph against a deterministic local real-wire handler using ReṼoman’s public MockHttpServer.

Artifact

Maven

<dependency>
    <groupId>com.salesforce.revoman</groupId>
    <artifactId>revoman</artifactId>
    <version>0.90.0</version>
</dependency>

Bazel

"com.salesforce.revoman:revoman"

Gradle Kts

implementation("com.salesforce.revoman:revoman:0.90.0")

Minimum Java Version required = 25 (0.90.x is the last line that runs on JDK 21)

revoman demo thumbnail
Figure 1. Tech-Talk given at Open Source Conf—2023, 🎴Slide deck

A Simple Example

Here is a simple exported Postman collection and Environment JSON file for a deterministic local real-wire handler. You can import the same metadata and manually test it through the Run collection button:

resfulapi dev pm

You can automate the same with ReṼoman by supplying the metadata and environment paths. ReṼoman ships MockHttpServer; DeterministicMockApi is this repository’s application-specific example handler. The example below explicitly owns the handler and server, injects the server URL, and then executes the API metadata (serialized in the Postman V2 schema) directly on the JVM:

import com.salesforce.revoman.integration.testsupport.DeterministicMockApi;
import com.salesforce.revoman.testing.http.MockHttpServer;
Current deterministic integration test → RestfulAPIDevTest.java
@Test
@DisplayName("restful-api.dev")
void restfulApiDev() {
  final var api = new DeterministicMockApi();
  try (final var server = MockHttpServer.start(api)) {
    final var rundown =
        ReVoman.revUp( (1)
            Kick.configure()
                .templatePath(PM_COLLECTION_PATH) (2)
                .environmentPath(PM_ENVIRONMENT_PATH) (3)
                .dynamicEnvironment("baseUrl", server.getBaseUrl())
                .nodeModulesPath("js")
                .off());
    assertThat(rundown.firstUnsuccessfulStepReport()).isNull(); (4)
    assertThat(rundown.stepReports).hasSize(4); (5)
    assertThat(
            rundown.stepReports.stream()
                .map(report -> report.requestInfo.get().httpMsg.getUri().toString())
                .toList())
        .containsExactly(
            server.getBaseUrl() + "/objects",
            server.getBaseUrl() + "/objects",
            server.getBaseUrl() + "/objects/local-object-1",
            server.getBaseUrl() + "/objects/local-object-1")
        .inOrder();
    assertThat(
            server.requests().stream()
                .map(request -> request.getMethod() + " " + request.getPath())
                .toList())
        .containsExactly(
            "GET /objects",
            "POST /objects",
            "PATCH /objects/local-object-1",
            "GET /objects/local-object-1")
        .inOrder();
  }
}
1 revUp is the method to call passing a configuration, built as below
2 Supply an exported Postman collection JSON file path
3 Supply an exported Postman environment JSON file path
4 Assert that the execution doesn’t have any failures
5 Run more assertions on the Rundown

MockHttpServer is a test-only listener bound to an ephemeral IPv4 127.0.0.1 address. It records request bodies in memory so you can inspect what ReVoman sent without calling a real HTTP service. Handlers may run concurrently, so mutable handler state must be thread-safe.

Next, see Configuration for how you build that configuration through Kick.configure(), and Rundown for the structured result the engine hands back.