span;
+
+ @Async
+ public void doSth() {
+ this.span = new AtomicReference<>(TraceContextHolder.getCurrentSpan());
+ }
+
+ public String getTraceId() {
+ if (this.span == null || (this.span.get() != null && this.span.get().getTraceId() == null)) {
+ return null;
+ }
+ return this.span.get().getTraceId();
+ }
+
+ public String getSpanName() {
+ if (this.span == null || (this.span.get() != null && this.span.get().getName() == null)) {
+ return null;
+ }
+ return this.span.get().getName();
+ }
+ }
+}
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/HttpMockServer.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/HttpMockServer.java
new file mode 100644
index 000000000..0f8914c74
--- /dev/null
+++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/HttpMockServer.java
@@ -0,0 +1,36 @@
+package org.springframework.cloud.sleuth.instrument.web.common;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.core.Options;
+
+/**
+ * Custom implementation of {@link WireMockServer} that by default registers itself at port
+ * {@link HttpMockServer#DEFAULT_PORT}.
+ *
+ * @see WireMockServer
+ *
+ * @author 4financeIT
+ */
+public class HttpMockServer extends WireMockServer {
+
+ public static final int DEFAULT_PORT = 8030;
+
+ HttpMockServer(int port) {
+ super(port);
+ }
+
+ HttpMockServer() {
+ super(DEFAULT_PORT);
+ }
+
+ HttpMockServer(Options options) {
+ super(options);
+ }
+
+ public void shutdownServer() {
+ if (isRunning()) {
+ stop();
+ }
+ shutdown();
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MockServerConfiguration.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MockServerConfiguration.java
new file mode 100644
index 000000000..4314d71c3
--- /dev/null
+++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MockServerConfiguration.java
@@ -0,0 +1,30 @@
+package org.springframework.cloud.sleuth.instrument.web.common;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.SocketUtils;
+
+@Configuration
+@Slf4j
+public class MockServerConfiguration {
+
+ @Bean(destroyMethod = "shutdownServer")
+ HttpMockServer httpMockServer() {
+ return tryToStartMockServer();
+ }
+
+ private HttpMockServer tryToStartMockServer() {
+ HttpMockServer httpMockServer = null;
+ while(httpMockServer == null) {
+ try {
+ httpMockServer = new HttpMockServer(SocketUtils.findAvailableTcpPort());
+ httpMockServer.start();
+ } catch (Exception exception) {
+ log.warn("Exception occurred while trying to set the port for the Wiremock server", exception);
+ httpMockServer = null;
+ }
+ }
+ return httpMockServer;
+ }
+}
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MvcITest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MvcITest.java
new file mode 100644
index 000000000..432316f71
--- /dev/null
+++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MvcITest.java
@@ -0,0 +1,45 @@
+package org.springframework.cloud.sleuth.instrument.web.common;
+
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.IntegrationTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+/**
+ * Base for specifications that use Spring's {@link MockMvc}. Provides also {@link WebApplicationContext},
+ * {@link ApplicationContext}. The latter you can use to specify what
+ * kind of address should be returned for a given dependency name.
+ *
+ * @see WebApplicationContext
+ * @see ApplicationContext
+ *
+ * @author 4financeIT
+ */
+@WebAppConfiguration
+@IntegrationTest
+public abstract class MvcITest {
+
+ @Autowired protected WebApplicationContext webApplicationContext;
+ @Autowired protected ApplicationContext applicationContext;
+ protected MockMvc mockMvc;
+
+ @Before
+ public void setup() {
+ DefaultMockMvcBuilder mockMvcBuilder = MockMvcBuilders.webAppContextSetup(this.webApplicationContext);
+ configureMockMvcBuilder(mockMvcBuilder);
+ this.mockMvc = mockMvcBuilder.build();
+ }
+
+ /**
+ * Override in a subclass to modify mockMvcBuilder configuration (e.g. add filter).
+ *
+ * The method from super class should be called.
+ */
+ protected void configureMockMvcBuilder(DefaultMockMvcBuilder mockMvcBuilder) {
+ }
+}
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MvcWiremockITest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MvcWiremockITest.java
new file mode 100644
index 000000000..822ed8d6e
--- /dev/null
+++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/common/MvcWiremockITest.java
@@ -0,0 +1,56 @@
+package org.springframework.cloud.sleuth.instrument.web.common;
+
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.sleuth.TraceManager;
+import org.springframework.cloud.sleuth.instrument.web.TraceFilter;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder;
+
+import com.github.tomakehurst.wiremock.client.MappingBuilder;
+import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
+import com.github.tomakehurst.wiremock.client.WireMock;
+
+/**
+ * Base specification for tests that use Wiremock as HTTP server stub.
+ * By extending this specification you gain a bean with {@link HttpMockServer} and a {@link WireMock}
+ *
+ * @author 4financeIT
+ * @see MockServerConfiguration
+ * @see WireMock
+ * @see HttpMockServer
+ *
+ * @author 4financeIT
+ */
+@ContextConfiguration(classes = {MockServerConfiguration.class})
+public abstract class MvcWiremockITest extends MvcITest {
+
+ protected WireMock wireMock;
+ @Autowired protected HttpMockServer httpMockServer;
+ @Autowired protected TraceManager trace;
+
+ @Override
+ @Before
+ public void setup() {
+ super.setup();
+ this.wireMock = new WireMock("localhost", this.httpMockServer.port());
+ this.wireMock.resetToDefaultMappings();
+ }
+
+ protected void stubInteraction(MappingBuilder mapping, ResponseDefinitionBuilder response) {
+ this.wireMock.register(mapping.willReturn(response));
+ }
+
+ public WireMock getWireMock() {
+ return this.wireMock;
+ }
+
+ public void setWireMock(WireMock wireMock) {
+ this.wireMock = wireMock;
+ }
+
+ @Override
+ protected void configureMockMvcBuilder(DefaultMockMvcBuilder mockMvcBuilder) {
+ mockMvcBuilder.addFilters(new TraceFilter(this.trace));
+ }
+}