From 8ce284795f839aa079fc3b9832f87e7036197550 Mon Sep 17 00:00:00 2001 From: Maciej Walkowiak Date: Wed, 14 Feb 2024 07:40:22 +0200 Subject: [PATCH] Output WireMock logs through Slf4j (#27) Fixes #26 --- .../spring/WireMockContextCustomizer.java | 34 ++++++++++++++++++- .../WireMockConfigurationCustomizerTest.java | 28 +++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/wiremock-spring-boot/src/main/java/com/maciejwalkowiak/wiremock/spring/WireMockContextCustomizer.java b/wiremock-spring-boot/src/main/java/com/maciejwalkowiak/wiremock/spring/WireMockContextCustomizer.java index 3f371fb..94ddcb2 100644 --- a/wiremock-spring-boot/src/main/java/com/maciejwalkowiak/wiremock/spring/WireMockContextCustomizer.java +++ b/wiremock-spring-boot/src/main/java/com/maciejwalkowiak/wiremock/spring/WireMockContextCustomizer.java @@ -5,6 +5,7 @@ import java.util.Objects; import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.common.Notifier; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import org.junit.platform.commons.util.ReflectionUtils; import org.junit.platform.commons.util.StringUtils; @@ -62,7 +63,8 @@ private void resolveOrCreateWireMockServer(ConfigurableApplicationContext contex // create & start wiremock server WireMockConfiguration serverOptions = options() .usingFilesUnderClasspath(resolveStubLocation(options)) - .port(options.port()); + .port(options.port()) + .notifier(new Slf4jNotifier(true)); if (options.extensions().length > 0) { serverOptions.extensions(options.extensions()); @@ -130,4 +132,34 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(configuration); } + + // ported from: https://github.com/spring-cloud/spring-cloud-contract/commit/44c634d0e9e82515d2fba66343530eb7d2ba8223 + static class Slf4jNotifier implements Notifier { + + private static final Logger log = LoggerFactory.getLogger("WireMock"); + + private final boolean verbose; + + Slf4jNotifier(boolean verbose) { + this.verbose = verbose; + } + + @Override + public void info(String message) { + if (verbose) { + log.info(message); + } + } + + @Override + public void error(String message) { + log.error(message); + } + + @Override + public void error(String message, Throwable t) { + log.error(message, t); + } + + } } diff --git a/wiremock-spring-boot/src/test/java/com/maciejwalkowiak/wiremock/spring/WireMockConfigurationCustomizerTest.java b/wiremock-spring-boot/src/test/java/com/maciejwalkowiak/wiremock/spring/WireMockConfigurationCustomizerTest.java index 0e1808a..6387041 100644 --- a/wiremock-spring-boot/src/test/java/com/maciejwalkowiak/wiremock/spring/WireMockConfigurationCustomizerTest.java +++ b/wiremock-spring-boot/src/test/java/com/maciejwalkowiak/wiremock/spring/WireMockConfigurationCustomizerTest.java @@ -1,13 +1,25 @@ package com.maciejwalkowiak.wiremock.spring; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.system.CapturedOutput; +import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.test.util.TestSocketUtils; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = WireMockConfigurationCustomizerTest.AppConfiguration.class) @@ -23,6 +35,7 @@ configurationCustomizers = WireMockConfigurationCustomizerTest.SampleConfigurationCustomizer.class ), }) +@ExtendWith(OutputCaptureExtension.class) class WireMockConfigurationCustomizerTest { private static final int USER_SERVICE_PORT = TestSocketUtils.findAvailableTcpPort(); private static final int TODO_SERVICE_PORT = TestSocketUtils.findAvailableTcpPort(); @@ -56,4 +69,19 @@ void appliesConfigurationCustomizer() { assertThat(todoService.port()).isEqualTo(TODO_SERVICE_PORT); } + @Test + void outputsWireMockLogs(CapturedOutput capturedOutput) throws IOException, InterruptedException { + userService.stubFor(get(urlEqualTo("/test")) + .willReturn(aResponse().withHeader("Content-Type", "text/plain").withBody("Hello World!"))); + + HttpClient httpClient = HttpClient.newHttpClient(); + HttpResponse response = httpClient.send( + HttpRequest.newBuilder().GET().uri(URI.create("http://localhost:" + userService.port() + "/test")).build(), + HttpResponse.BodyHandlers.ofString()); + assertThat(response.body()).isEqualTo("Hello World!"); + assertThat(capturedOutput.getAll()) + .as("Must contain debug logging for WireMock") + .contains("Matched response definition:"); + } + }