我在 Spring Boot 集成测试中观察到一些我还不理解的行为。
给出以下抽象基类,它初始化“通用”测试内容;在这种情况下
WireMock
和 Spring 的 WebTestClient
。
AbstractSpringIT.java
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("integration-test")
@AutoConfigureWebTestClient
public abstract class AbstractSpringIT {
@RegisterExtension
static WireMockExtension wireMockServer = WireMockExtension.newInstance()
.options(wireMockConfig().dynamicPort())
.build();
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("app.backend-url", wireMockServer::baseUrl);
}
@Autowired
WebTestClient webTestClient;
}
然后,有两个测试类扩展了
AbstractSpringIT
。
另一个IT.java
public class AnotherIT extends AbstractSpringIT {
@Test
void should_pass() {
wireMockServer.stubFor(get("/some-path").willReturn(ok()));
webTestClient.mutateWith(mockOAuth2Client("keycloak"))
.get()
.uri("/some-path")
.exchange()
.expectStatus()
.is2xxSuccessful();
}
}
一些IT.java
public class SomeIT extends AbstractSpringIT {
@Test
void should_pass() {
webTestClient.mutateWith(mockOAuth2Login()))
.get()
.uri("/api/user")
.exchange()
.expectStatus().isOk();
}
}
单独开始时,两个测试类都通过了。然而,当它们一起运行时,
AnotherIT
由于 Connection refused: localhost/[0:0:0:0:0:0:0:1]:39813
而失败。
我可以将范围缩小到这个:
AnotherIT
运行于 before SomeIT
。WireMockExtension
和 @DynamicPropertySource
时,它们都会通过。你解决了吗?您将其注册为
@RegisterExtension
,因此它具有生命周期,可能会在所有测试方法之后停止服务器(但对于特定类)。也许再次盯着它会生成一个新端口(dynamicPort
选项),使您的@DynamicPropertySource
过时?我无法解释为什么顺序很重要。