Skip to content

Commit

Permalink
Merge pull request #77 from wiremock/feature/issue-73-register-spring…
Browse files Browse the repository at this point in the history
…-bean

feat: register WireMockServer as a Spring Bean (refs #73)
  • Loading branch information
tomasbjerre authored Jan 20, 2025
2 parents 53a4378 + 6379c85 commit 1b42d76
Show file tree
Hide file tree
Showing 9 changed files with 140 additions and 2 deletions.
11 changes: 9 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,25 @@ dependencies {
implementation platform("org.eclipse.jetty:jetty-bom:12.0.15")
api "org.wiremock:wiremock-jetty12:${wiremockVersion}"

api "org.springframework.boot:spring-boot-test:3.3.4"
api "org.springframework.boot:spring-boot-test:3.4.1"
api "org.springframework:spring-test:6.1.13"
api "org.slf4j:slf4j-api:2.0.16"
api 'org.junit.jupiter:junit-jupiter-api:5.11.2'

testImplementation "org.wiremock:wiremock-jetty12:${wiremockVersion}"
testImplementation "org.springframework.boot:spring-boot-starter-test:3.3.4"
testImplementation "org.springframework.boot:spring-boot-starter-test:3.4.1"
testImplementation 'org.assertj:assertj-core:3.26.3'
testImplementation platform('org.junit:junit-bom:5.11.2')
testImplementation 'org.junit.jupiter:junit-jupiter'
testImplementation 'org.junit.platform:junit-platform-launcher'
testImplementation 'io.rest-assured:rest-assured:5.5.0'
testImplementation 'io.rest-assured:rest-assured:5.5.0'
testImplementation "org.springframework.boot:spring-boot-starter-web:3.4.1"
testImplementation 'io.cucumber:cucumber-java:7.20.1'
testImplementation 'io.cucumber:cucumber-spring:7.20.1'
testImplementation 'io.cucumber:cucumber-junit-platform-engine:7.20.1'
testImplementation 'org.junit.platform:junit-platform-suite:1.11.4'
testImplementation 'org.assertj:assertj-core:3.26.3'

constraints {
implementation('org.apache.commons:commons-compress:1.26.0') {
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/org/wiremock/spring/ConfigureWireMock.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.github.tomakehurst.wiremock.extension.ExtensionFactory;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import org.springframework.beans.factory.annotation.Autowired;

/**
* Configures WireMock instance.
Expand Down Expand Up @@ -125,4 +126,10 @@
* between test runs.
*/
boolean resetWireMockServer() default true;

/**
* If <code>true</code>, it will register {@link WireMockServer} as a Spring Bean so that it can
* be {@link Autowired} by name.
*/
boolean registerSpringBean() default false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,11 @@ public WireMockServer createWireMockServer(
});
}

if (options.registerSpringBean()) {
this.logger.info("Registering WireMockServer '" + options.name() + "' as a Spring Bean.");
context.getBeanFactory().registerSingleton(options.name(), newServer);
}

return newServer;
}

Expand Down
33 changes: 33 additions & 0 deletions src/test/java/usecases/AutowireNamedWireMockServerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package usecases;

import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;

import com.github.tomakehurst.wiremock.WireMockServer;
import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.wiremock.spring.ConfigureWireMock;
import org.wiremock.spring.EnableWireMock;

@SpringBootTest
@EnableWireMock(@ConfigureWireMock(name = "mywiremock", registerSpringBean = true))
class AutowireNamedWireMockServerTest {

@Qualifier("mywiremock")
@Autowired
private WireMockServer wireMockServer;

@Value("${wiremock.server.baseUrl}")
private String wiremockUrl;

@Test
void returnsTodos() {
this.wireMockServer.stubFor(get("/ping").willReturn(aResponse().withStatus(200)));

RestAssured.when().get(this.wiremockUrl + "/ping").then().statusCode(200);
}
}
5 changes: 5 additions & 0 deletions src/test/java/usecases/cucumber/CucumberConstants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package usecases.cucumber;

public class CucumberConstants {
public static final String WIREMOCK_SERVER_NAME = "my-wiremock-server";
}
14 changes: 14 additions & 0 deletions src/test/java/usecases/cucumber/CucumberSpringConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package usecases.cucumber;

import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;

import io.cucumber.spring.CucumberContextConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.wiremock.spring.ConfigureWireMock;
import org.wiremock.spring.EnableWireMock;

@CucumberContextConfiguration
@SpringBootTest(webEnvironment = RANDOM_PORT)
@EnableWireMock(
@ConfigureWireMock(name = CucumberConstants.WIREMOCK_SERVER_NAME, registerSpringBean = true))
public class CucumberSpringConfiguration {}
10 changes: 10 additions & 0 deletions src/test/java/usecases/cucumber/RunCucumberTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package usecases.cucumber;

import org.junit.platform.suite.api.IncludeEngines;
import org.junit.platform.suite.api.SelectClasspathResource;
import org.junit.platform.suite.api.Suite;

@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("usecases/cucumber")
public class RunCucumberTest {}
49 changes: 49 additions & 0 deletions src/test/java/usecases/cucumber/Steps.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package usecases.cucumber;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
import io.cucumber.java.Before;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import io.restassured.RestAssured;
import io.restassured.response.ExtractableResponse;
import io.restassured.response.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Steps {

@Qualifier(CucumberConstants.WIREMOCK_SERVER_NAME)
@Autowired
private WireMockServer wireMockServer;

private ExtractableResponse<Response> actualResponse;

@Before
public void beforeEach() {
wireMockServer.resetAll();
RestAssured.baseURI = "http://localhost:" + wireMockServer.port();
}

@Given("^WireMock has endpint (.*)")
public void wireMockHasEndpoint(String endpoint) {
StubMapping okResponse =
WireMock.any(WireMock.urlEqualTo("/" + endpoint)).willReturn(WireMock.status(200)).build();
wireMockServer.addStubMapping(okResponse);
}

@When("^WireMock is invoked with (.*)")
public void wireMockIsInvokedWith(String endpoint) {
actualResponse = RestAssured.when().get("/" + endpoint).then().extract();
}

@Then("^it should respond (.*)")
public void isShouldResponsWith(int status) {
assertThat(actualResponse.statusCode()).isEqualTo(status);
}
}
8 changes: 8 additions & 0 deletions src/test/resources/usecases/cucumber/test.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Feature: Test that features can be used

Scenario: Setup WireMock in Given and try it out in then
Given WireMock has endpint ping
When WireMock is invoked with ping
Then it should respond 200
When WireMock is invoked with pang
Then it should respond 404

0 comments on commit 1b42d76

Please sign in to comment.