Jor*_*lva 6 java spring integration-testing spring-boot wiremock
我有以下场景:
@Transactional
@SpringBootTest
@ActiveProfiles("test")
@AutoConfigureMockMvc
@AutoConfigureWireMock(port = 0)
public abstract class IntegrationTest {
}
public class Test1 extends IntegrationTest {
// Tests that use WireMock
}
@ActiveProfiles("specific-case-test") // This causes another Application Context to be created.
public class Test2 extends IntegrationTest {
// Tests that use WireMock
}
public class Test3 extends IntegrationTest {
// Tests that use WireMock
}
Run Code Online (Sandbox Code Playgroud)
测试在所有这些场景中成功运行:
在所有这些情况下,最后运行的测试都会失败:
我已经调查过这个问题,它与 Spring Application Context 和 WireMock 有关。
到底是怎么回事?让我们考虑测试按以下顺序运行:Test1, Test2, Test3。
运行时Test1,将创建应用程序上下文 (AC1),并在端口 1 上设置 WireMock 服务器 (WM1)。端口 1 设置为 AC1 ( wiremock.server.port),并将 WM1 连接到测试线程。所有测试均通过。
运行时Test2,会创建另一个应用程序上下文 (AC2),并在端口 2 上设置一个新的 WireMock 服务器 (WM2)。端口 2 设置为 AC2 ( wiremock.server.port),并且 WM2 附加到测试线程,取代 WM1。所有测试均通过。
运行时Test3,它会重用 AC1,这会导致测试失败并显示消息:404 Not Found: [No response could be served as there are no stub mappings in this WireMock instance.]。应用程序状态为wiremock.server.port1(来自 AC1)并且 WM2 附加到测试线程。因此,存根是针对 WM2 进行的,但应用程序其余调用将发送到正在侦听端口 1 的 WM1。
我已经尝试清理添加@DirtiesContext到 Test2 的应用程序上下文,因此它会强制 Spring 加载第三个 AC,但它不起作用。但是,如果我添加@DirtiesContext到 Test1 或@DirtiesContext(classMode = BEFORE_CLASS)Test3,它就会起作用。我不想要这个解决方案,因为我还有其他测试,并且不能保证测试将按什么顺序运行,所以如果我将其添加到 Test3,那么稍后执行顺序将发生变化,另一个测试将失败。我想要一个真正的解决方案。
有任何想法吗?
小智 3
不确定您是否找到了解决方案,但这就是我解决此问题的方法。
当重用 spring 缓存的测试上下文时,wiremock 端口会更改回该上下文端口,但似乎错过了配置WireMock类默认服务器配置的某些步骤。我们必须使用当前运行上下文的端口调用WireMock.configureFor(port)or@Before方法。@BeforeEach这意味着当我们进行stubFor方法调用时,正确的 WireMock 端口会被命中,并且服务器会正确配置我们的存根,请确保在任何重置之前也进行此配置。
@Autowired
private Environment environment;
private String getWiremockServerPort() {
// Get the auto configured port property from the current Spring contexts environment
return environment.getProperty("wiremock.server.port");
}
@BeforeEach
private void configureWireMockPortToMatchEnvironmentContext() {
int contextEnvironmentPort = Integer.parseInt(getWiremockServerPort());
configureFor(contextEnvironmentPort);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2447 次 |
| 最近记录: |