我有一个通过标准端口机制启动的Spring Boot应用程序,即将属性值server.port设置为一个固定数字,例如8081.我设法在该Spring Boot应用程序中公开了第二个/单独的端口,在该端口上可以使用一些其他(Read:内部)REST端点.因此,我介绍了server.internalPort号物业.

在运行@SpringBootTest积分测试时,我可以很容易地通过webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT随机化server.port的值.但我也需要以某种方式随机化属性server.internalPort的值.

有没有一种简单的方法可以在测试启动时为随机化注册属性值?例如,我的测试是这样的:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
...
public abstract class AbstractSomethingIntegrationTest {

  @LocalServerPort
  private int port;

  @Value("${server.internalPort}")
  private int internalPort;

变量port得到一个随机值,而internalPort不是.它获得我在integrationtest/resources/application.yml文件中使用的值.

推荐答案

经过一些研究,我发现我可以为这个特定的测试用例使用类和方法org.springframework.test.util.TestSocketUtils.findAvailableTcpPort(),其中was introduced afterSocketUtils已经被移除.

在此基础上,我实现了类似的RandomPortInitializer:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public abstract class AbstractIntegrationTest {

  // This value will be set later by the RandomPortInitializer
  @Value("${server.internalPort}")
  int internalPort;

  ...

  public static class RandomPortInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

      @Override
      public void initialize(ConfigurableApplicationContext applicationContext) {
        int randomPort = TestSocketUtils.findAvailableTcpPort();
        TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext,
              "server.internalPort=" + randomPort);
      }
    }
  ...
}

我在我的具体测试类上使用该初始化式,在那里我可以访问internalPort值.

@DisplayName("Do some tests")
@ContextConfiguration(initializers = {RandomPortInitializer.class})
class MyIntegrationTest extends AbstractIntegrationTest {
...

Java相关问答推荐

使用log 4j2格式的Hibernate 显示SQL日志(log)

如何在Javascript中设置文本区域圆角的样式

Java 8中的多个字段和计数

Junit with Mockito for java

使用动态ID从json获取详细信息的Jolt规范

';com.itextpdf.ext.html.WebColors已弃用

如何判断一个矩阵是否为有框矩阵?

什么是Java原子属性的正确getter和setter

在Spring终结点中,是否可以同时以大写和小写形式指定枚举常量?

如何创建模块信息类文件并将其添加到JAR中?

A.ForEach与For(类型a:集合)

在JDK Flight Recorder中只记录单个线程

Java HashMap保留所有时间复杂性

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

让标签占用JavaFX中HBox的所有可用空间

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

可以';不要在Intellij IDEA中使用最新的Java版本(JDK 21)

如何组合Mono和Flux

将在 Docker 中运行的 Spring Boot 连接到在 Docker 中运行的 PostgreSQL,无需 compose 文件?