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