A Java native language binding for Hoverfly, a Go proxy which allows you to simulate http services in your unit tests. Another term for this is Service Virtualisation.
As long as our pull requests are not yet accepted and officially released, use the following commands to deploy the snapshot artifacts to our Maven repository.
export MAVEN_REPO_URL_RELEASE='https://.../artifactory/ext-release-local'
export MAVEN_REPO_URL_SNAPSHOT='https://.../artifactory/ext-snapshot-local'
export MAVEN_REPO_USERNAME='...'
export MAVEN_REPO_PASSWORD='...'
gradle clean build uploadArchives
-
Simulation of http/https services
-
Strict or loose http request matching based on URL, method, body and header combinations
-
Fluent and expressive DSL for easy generation of simulated services
-
Automatic marshalling of objects into JSON during request / response body generation
-
Create simulations by running in capture mode
-
Hoverfly is a proxy, so you don’t need to alter the host that you make requests to
-
Multiple hosts / services per single instance of Hoverfly
-
Https automatically supported, no extra configuration required
-
Interoperable with standard Hoverfly JSON, making it easy to re-use data between Java and other native language bindings.
-
Use externally managed Hoverfly cluster for API simulations
-
Request verification
-
Response templating
Full documentation is available here
<dependency>
<groupId>io.specto</groupId>
<artifactId>hoverfly-java</artifactId>
<version>0.9.3</version>
<scope>test</scope>
</dependency>
// Capture and output HTTP traffic to json file
@ClassRule
public static HoverflyRule hoverflyRule = HoverflyRule.inCaptureMode("simulation.json");
// After the capturing, switch to inSimulationMode to spin up a stub server
@ClassRule
public static HoverflyRule hoverflyRule = HoverflyRule.inSimulationMode(defaultPath("simulation.json"));
// Or you can use both approaches at once. If json file not present in capture mode, if present in simulation mode
@ClassRule
public static HoverflyRule hoverflyRule = HoverflyRule.inCaptureOrSimulationMode("simulation.json");
@ClassRule
public static HoverflyRule hoverflyRule = HoverflyRule.inSimulationMode(dsl(
service("www.my-test.com")
.get("/api/bookings/1")
.willReturn(created("http://localhost/api/bookings/1"))
));
@Test
public void shouldBeAbleToGetABookingUsingHoverfly() {
// When
final ResponseEntity<String> getBookingResponse = restTemplate.getForEntity("http://www.my-test.com/api/bookings/1", String.class);
// Then
assertEquals(bookFlightResponse.getStatusCode(), CREATED);
assertEquals(bookFlightResponse.getHeaders().getLocation(), "http://localhost/api/bookings/1");
}
Some code examples for the DSL are available here.
More code examples for the DSL using request matchers can be found here.
// Verify that at least one request to a specific endpoint with any query params
hoverflyRule.verify(service(matches("*.flight.*")).get("/api/bookings").anyQueryParams(), atLeastOnce());
// Verify that an external service/dependency was not called
hoverflyRule.verifyZeroRequestTo(service(matches("*.flight.*")));
// Verify all the stubbed requests were made at least once
hoverflyRule.verifyAll();
Contributions are welcome!
To submit a pull request you should fork the Hoverfly-Java repository, and make your change on a feature branch of your fork.