diff --git a/build.gradle b/build.gradle
index 89eda1a..7cd6500 100644
--- a/build.gradle
+++ b/build.gradle
@@ -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') {
diff --git a/src/main/java/org/wiremock/spring/ConfigureWireMock.java b/src/main/java/org/wiremock/spring/ConfigureWireMock.java
index 3a7bbc4..bce22e5 100644
--- a/src/main/java/org/wiremock/spring/ConfigureWireMock.java
+++ b/src/main/java/org/wiremock/spring/ConfigureWireMock.java
@@ -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.
@@ -125,4 +126,10 @@
* between test runs.
*/
boolean resetWireMockServer() default true;
+
+ /**
+ * If true
, it will register {@link WireMockServer} as a Spring Bean so that it can
+ * be {@link Autowired} by name.
+ */
+ boolean registerSpringBean() default false;
}
diff --git a/src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java b/src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java
index 1bee791..923058f 100644
--- a/src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java
+++ b/src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java
@@ -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;
}
diff --git a/src/test/java/usecases/AutowireNamedWireMockServerTest.java b/src/test/java/usecases/AutowireNamedWireMockServerTest.java
new file mode 100644
index 0000000..e7575b5
--- /dev/null
+++ b/src/test/java/usecases/AutowireNamedWireMockServerTest.java
@@ -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);
+ }
+}
diff --git a/src/test/java/usecases/cucumber/CucumberConstants.java b/src/test/java/usecases/cucumber/CucumberConstants.java
new file mode 100644
index 0000000..816a828
--- /dev/null
+++ b/src/test/java/usecases/cucumber/CucumberConstants.java
@@ -0,0 +1,5 @@
+package usecases.cucumber;
+
+public class CucumberConstants {
+ public static final String WIREMOCK_SERVER_NAME = "my-wiremock-server";
+}
diff --git a/src/test/java/usecases/cucumber/CucumberSpringConfiguration.java b/src/test/java/usecases/cucumber/CucumberSpringConfiguration.java
new file mode 100644
index 0000000..577cfed
--- /dev/null
+++ b/src/test/java/usecases/cucumber/CucumberSpringConfiguration.java
@@ -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 {}
diff --git a/src/test/java/usecases/cucumber/RunCucumberTest.java b/src/test/java/usecases/cucumber/RunCucumberTest.java
new file mode 100644
index 0000000..d5c24a8
--- /dev/null
+++ b/src/test/java/usecases/cucumber/RunCucumberTest.java
@@ -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 {}
diff --git a/src/test/java/usecases/cucumber/Steps.java b/src/test/java/usecases/cucumber/Steps.java
new file mode 100644
index 0000000..4f9c625
--- /dev/null
+++ b/src/test/java/usecases/cucumber/Steps.java
@@ -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 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);
+ }
+}
diff --git a/src/test/resources/usecases/cucumber/test.feature b/src/test/resources/usecases/cucumber/test.feature
new file mode 100644
index 0000000..ca38590
--- /dev/null
+++ b/src/test/resources/usecases/cucumber/test.feature
@@ -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