java - Spring Boot 2.1.1 中带有 RANDOM_PORT 的 SpringBootTest 每次都使用 8080

标签 java spring spring-boot spring-boot-test

我有一个在 Spring Boot 2.1.1 和 Java 11 中运行的测试类,无论我做什么,它都在端口 8080 上运行:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RunWith( SpringJUnit4ClassRunner.class )
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
    classes = TestClass.Config.class
)
@ContextConfiguration(
    classes = TestClass.Config.class
)
@TestPropertySource( properties = "server.port=0" )
public class TestClass
{
    @LocalServerPort
    private String port;

    @Test
    public void testPort() throws Exception
    {
        mockMvc
        .perform(
            MockMvcRequestBuilders.get( "/" )
        )
        .andExpect( MockMvcResultMatchers.status().isOk() );
    }

    @Configuration
    @RestController
    public static class Config
    {
        @Bean
        ServletWebServerFactory servletWebServerFactory()
        {
            return new TomcatServletWebServerFactory();
        }

        @GetMapping( "/" )
        public String test(HttpServletRequest request, HttpServletResponse response)
        {
            //This still shows no random port
            System.out.println( request.getLocalPort() );

            return "ok";
        }
    }
}

即使我尝试这样做:

@Bean
ServletWebServerFactory servletWebServerFactory()
{
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.setPort( SocketUtils.findAvailableTcpPort() );
    return factory;
}

确实导致字段port具有随机端口号,MockMvc仍然使用我的 Controller 的默认端口。

如何让它使用随机端口?

最佳答案

尝试将端口设置为 0 ,它对我有用。

@Bean
ServletWebServerFactory servletWebServerFactory() {
    return new TomcatServletWebServerFactory(0);
}

运行测试两次会产生 2 个不同的随机端口。

  1. 63957
  2. 64043

关于java - Spring Boot 2.1.1 中带有 RANDOM_PORT 的 SpringBootTest 每次都使用 8080,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53734428/

相关文章:

java - 执行 findBy[NAME]In(List<Long> ids) 时使用 eclipse 链接 POSTGRESQL 的 SPRING JPA 中出现错误

spring-boot - 如何查看我的 Spring Boot 应用程序中是否启用了事务管理?

spring-boot - Kotlin 使用存储库进行测试(spring-boot、kotlin、jersey、jax-rs)

java - 无法从类 : java 中找到图像文件

java - JTextPane - HTMLDocument : when adding/removing a new style, 其他属性也发生变化

java - 最后一个工作日期非假期

java - Spring RedirectAttributes : addAttribute() vs addFlashAttribute()

java - Spring启动应用程序(eureka客户端)抛出ClassNotFoundException : javax. ws.rs.core.Response$StatusType

java - 从其他 JVM 调用其他 JVM 中的任何其他 servlet 的最佳实践是什么

java - 如何在 Flowable 中执行高效的卸载过程