Skip to content

Commit 3d85753

Browse files
authored
Add support for specifying extension factories via the configuration annotation (#67)
Added support for specifying extension factories via the configuration annotation
1 parent 4ed94e6 commit 3d85753

File tree

4 files changed

+163
-0
lines changed

4 files changed

+163
-0
lines changed

src/main/java/org/wiremock/spring/ConfigureWireMock.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.github.tomakehurst.wiremock.WireMockServer;
44
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
55
import com.github.tomakehurst.wiremock.extension.Extension;
6+
import com.github.tomakehurst.wiremock.extension.ExtensionFactory;
67
import java.lang.annotation.Retention;
78
import java.lang.annotation.RetentionPolicy;
89

@@ -100,6 +101,13 @@
100101
*/
101102
Class<? extends Extension>[] extensions() default {};
102103

104+
/**
105+
* WireMock extensions to register in {@link WireMockServer}.
106+
*
107+
* @return the extensions
108+
*/
109+
Class<? extends ExtensionFactory>[] extensionFactories() default {};
110+
103111
/**
104112
* Customizes {@link WireMockConfiguration} used by {@link WireMockServer} instance. Customizers
105113
* are ordered by their natural order in this array. Each customizer must have no-arg constructor.

src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
44

55
import com.github.tomakehurst.wiremock.WireMockServer;
6+
import com.github.tomakehurst.wiremock.common.Exceptions;
67
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
8+
import com.github.tomakehurst.wiremock.extension.ExtensionFactory;
79
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
810
import java.io.File;
911
import java.nio.file.Path;
@@ -74,6 +76,10 @@ public WireMockServer createWireMockServer(
7476
});
7577
});
7678

79+
if (options.extensionFactories().length > 0) {
80+
serverOptions.extensionFactories(options.extensionFactories());
81+
}
82+
7783
if (options.extensions().length > 0) {
7884
serverOptions.extensions(options.extensions());
7985
}
@@ -277,4 +283,10 @@ private void applyCustomizers(
277283
}
278284
}
279285
}
286+
287+
private static ExtensionFactory instantiateExtensionFactory(
288+
Class<? extends ExtensionFactory> factoryClass) {
289+
return Exceptions.uncheck(
290+
() -> factoryClass.getDeclaredConstructor().newInstance(), ExtensionFactory.class);
291+
}
280292
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package test;
2+
3+
import static com.github.tomakehurst.wiremock.client.WireMock.*;
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
6+
import com.github.tomakehurst.wiremock.WireMockServer;
7+
import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
8+
import com.github.tomakehurst.wiremock.extension.Extension;
9+
import com.github.tomakehurst.wiremock.extension.ExtensionFactory;
10+
import com.github.tomakehurst.wiremock.extension.ResponseDefinitionTransformerV2;
11+
import com.github.tomakehurst.wiremock.extension.WireMockServices;
12+
import com.github.tomakehurst.wiremock.http.ResponseDefinition;
13+
import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
14+
import java.net.URI;
15+
import java.net.http.HttpClient;
16+
import java.net.http.HttpRequest;
17+
import java.net.http.HttpResponse;
18+
import java.util.List;
19+
import org.junit.jupiter.api.Test;
20+
import org.springframework.boot.autoconfigure.SpringBootApplication;
21+
import org.springframework.boot.test.context.SpringBootTest;
22+
import org.wiremock.spring.ConfigureWireMock;
23+
import org.wiremock.spring.EnableWireMock;
24+
import org.wiremock.spring.InjectWireMock;
25+
26+
@SpringBootTest(classes = ExtensionFactoriesTest.AppConfiguration.class)
27+
@EnableWireMock({
28+
@ConfigureWireMock(
29+
extensionFactories = {ExtensionFactoriesTest.HeaderAddingExtensionFactory.class})
30+
})
31+
class ExtensionFactoriesTest {
32+
33+
@InjectWireMock private WireMockServer wm;
34+
35+
HttpClient httpClient = HttpClient.newHttpClient();
36+
37+
@Test
38+
void extensionIsLoaded() throws Exception {
39+
wm.stubFor(any(anyUrl()).willReturn(ok()));
40+
41+
HttpResponse<String> response =
42+
httpClient.send(
43+
HttpRequest.newBuilder().GET().uri(URI.create(wm.baseUrl() + "/test")).build(),
44+
HttpResponse.BodyHandlers.ofString());
45+
46+
assertThat(response.headers().firstValue("added-header").get()).isEqualTo("present");
47+
}
48+
49+
@SpringBootApplication
50+
static class AppConfiguration {}
51+
52+
public static class HeaderAddingExtensionFactory implements ExtensionFactory {
53+
54+
@Override
55+
public List<Extension> create(WireMockServices services) {
56+
return List.of(new HeaderAddingExtension());
57+
}
58+
}
59+
60+
public static class HeaderAddingExtension implements ResponseDefinitionTransformerV2 {
61+
62+
@Override
63+
public ResponseDefinition transform(ServeEvent serveEvent) {
64+
return ResponseDefinitionBuilder.like(serveEvent.getResponseDefinition())
65+
.withHeader("added-header", "present")
66+
.build();
67+
}
68+
69+
@Override
70+
public boolean applyGlobally() {
71+
return true;
72+
}
73+
74+
@Override
75+
public String getName() {
76+
return "header-add";
77+
}
78+
}
79+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package test;
2+
3+
import static com.github.tomakehurst.wiremock.client.WireMock.*;
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
6+
import com.github.tomakehurst.wiremock.WireMockServer;
7+
import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
8+
import com.github.tomakehurst.wiremock.extension.ResponseDefinitionTransformerV2;
9+
import com.github.tomakehurst.wiremock.http.ResponseDefinition;
10+
import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
11+
import java.net.URI;
12+
import java.net.http.HttpClient;
13+
import java.net.http.HttpRequest;
14+
import java.net.http.HttpResponse;
15+
import org.junit.jupiter.api.Test;
16+
import org.springframework.boot.autoconfigure.SpringBootApplication;
17+
import org.springframework.boot.test.context.SpringBootTest;
18+
import org.wiremock.spring.ConfigureWireMock;
19+
import org.wiremock.spring.EnableWireMock;
20+
import org.wiremock.spring.InjectWireMock;
21+
22+
@SpringBootTest(classes = ExtensionsTest.AppConfiguration.class)
23+
@EnableWireMock({@ConfigureWireMock(extensions = {ExtensionsTest.HeaderAddingExtension.class})})
24+
class ExtensionsTest {
25+
26+
@InjectWireMock private WireMockServer wm;
27+
28+
HttpClient httpClient = HttpClient.newHttpClient();
29+
30+
@Test
31+
void extensionIsLoaded() throws Exception {
32+
wm.stubFor(any(anyUrl()).willReturn(ok()));
33+
34+
HttpResponse<String> response =
35+
httpClient.send(
36+
HttpRequest.newBuilder().GET().uri(URI.create(wm.baseUrl() + "/test")).build(),
37+
HttpResponse.BodyHandlers.ofString());
38+
39+
assertThat(response.headers().firstValue("added-header").get()).isEqualTo("present");
40+
}
41+
42+
@SpringBootApplication
43+
static class AppConfiguration {}
44+
45+
public static class HeaderAddingExtension implements ResponseDefinitionTransformerV2 {
46+
47+
@Override
48+
public ResponseDefinition transform(ServeEvent serveEvent) {
49+
return ResponseDefinitionBuilder.like(serveEvent.getResponseDefinition())
50+
.withHeader("added-header", "present")
51+
.build();
52+
}
53+
54+
@Override
55+
public boolean applyGlobally() {
56+
return true;
57+
}
58+
59+
@Override
60+
public String getName() {
61+
return "header-add";
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)