gpt4 book ai didi

java - 在 spring boot 测试中使用 wiremock 随机端口设置属性

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:07 24 4
gpt4 key购买 nike

我有一个 Spring Boot 测试,它使用 wiremock 来模拟外部服务。为了避免与并行构建发生冲突,我不想为 wiremock 设置固定端口号,而是希望依赖其动态端口配置。

应用程序使用在 application.yml(在 src/test/resources 下)中设置的属性 (external.baseUrl)。但是我没有找到以编程方式覆盖它的方法。我试过这样的事情:

    WireMockServer wireMockServer = new WireMockServer();
wireMockServer.start();
WireMock mockClient = new WireMock("localhost", wireMockServer.port());
System.setProperty("external.baseUrl", "http://localhost:" + wireMockServer.port());

但它不起作用,而是使用了 application.yml 中的值。我看过的所有其他解决方案都使用静态值覆盖该属性(例如在某些注释中),但在测试运行之前我不知道 wiremock 端口的值。

澄清:

spring boot 和 wiremock 都在随机端口上运行。 很好,我知道如何获取两个端口的值。然而,wiremock 应该模拟外部服务,我需要告诉我的应用程序如何访问它。我使用 external.baseUrl 属性执行此操作。我想在测试中设置的值当然取决于 wiremock 端口号。 我的问题只是如何在 spring boot 测试中以编程方式设置属性

最佳答案

https://stackoverflow.com/a/48859553/309683中提到的属性名称(即 wiremock.port)不正确,至少从 Spring Cloud Contract 版本 2.1.2.RELEASE 开始是这样。

1。工作示例

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
import org.springframework.core.env.Environment;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
public class PortServiceTest {

@Autowired
private Environment environment;

@Test
public void shouldPopulateEnvironmentWithWiremockPort() {
assertThat(environment.containsProperty("wiremock.server.port")).isTrue();
assertThat(environment.getProperty("wiremock.server.port")).matches("\\d+");
}

}

2。其他 WireMock 属性

除了 wiremock.server.port@AutoConfigureWireMock 还使用其他一些属性填充环境:

  1. wiremock.server.https-port
  2. wiremock.server.stubs[]
  3. wiremock.server.files[]

3。 Gradle 依赖

要在基于 Gradle 的项目中使用 Spring Cloud Contract WireMock,请将以下依赖项添加到您的项目中:

testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock:${version}'

4。在 application.yaml 文件中使用

如果您像这样配置测试 application.yaml 文件:

sample:
port: ${wiremock.server.port}

并定义以下bean:

@Component
@ConfigurationProperties(prefix = "sample")
@Data
public class PortProperties {
private Integer port;
}

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class PortService {
private final PortProperties config;

public Integer getPort() {
return config.getPort();
}
}

您可以验证 sample.port 是否设置为随机选择的 wiremock 端口:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
public class PortServiceTest {
@Autowired
private Environment environment;

@Autowired
private PortService portService;

@Test
public void shouldReturnWireMockPort() {
assertThat(portService.getPort())
.isNotNull()
.isEqualTo(Integer.parseInt(environment.getProperty("wiremock.server.port")));
}
}

关于java - 在 spring boot 测试中使用 wiremock 随机端口设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48707625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com