Skip to content

feat: register WireMockServer as a Spring Bean (refs #73) #77

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading