You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot测试报错:未找到Port变量,已配置RANDOM_PORT

Spring Boot测试报错:Symbol not found, Symbol: Variable Port 解决办法

我在Spring Boot应用测试中遇到报错:Symbol not found, Symbol: Variable Port。已通过WebEnvironment.RANDOM_PORT配置随机端口,但测试代码里使用的port变量未被正确注入,导致两个测试方法均无法运行。尝试移除端口依赖后发现端口是必需的,以下是问题原因及解决办法:

测试代码片段

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class PersonEntityApplicationTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private PersonEntityRepository personRepository;

    @Test
    @Order(1)
    public void testGetPersonEntityById() {
        PersonEntity person = PersonEntity.builder()
                .firstname("John")
                .lastname("Doe")
                .age(29)
                .build();

        person = personRepository.save(person);

        ResponseEntity<PersonEntity> response = restTemplate.getForEntity(
"http://localhost:"  + port + "/persons/" + person.getId(), PersonEntity.class);
        assertEquals(HttpStatus.OK, response.getStatusCode());
        assertNotNull(response.getBody());
        assertEquals("John", response.getBody().getFirstname());
        assertEquals("Doe", response.getBody().getLastname());
        assertEquals(29, response.getBody().getAge());
    }
...

另一个报错的测试方法:

@Test
    @Order(2)
    public void testUpdatePersonEntity() {
        PersonEntity person = PersonEntity.builder()
                .firstname("Joe")
                .lastname("Doe")
                .age(29)
                .build();

        personRepository.save(person);

        PersonEntity updatedPersonEntity = PersonEntity.builder()
                .firstname("John")
                .lastname("Doe")
                .age(29)
                .build();

        String url = "http://localhost:" + port + "/persons/update/1";
        ResponseEntity<PersonEntity> response = restTemplate.exchange(url,
                HttpMethod.PUT,
                new HttpEntity<>(updatedPersonEntity),
                PersonEntity.class
        );

        assertEquals(HttpStatus.OK, response.getStatusCode());
        PersonEntity responseBody = response.getBody();
        assertThat(responseBody).isNotNull();
        assertThat(responseBody.getLastname())
        .isEqualTo(updatedPersonEntity.getLastname());
    }

问题原因

核心原因是:你仅配置了RANDOM_PORT让Spring Boot随机分配端口,但测试类中既未定义port变量,也未通过Spring注解注入实际端口值,Java编译器找不到该变量,因此抛出Symbol not found错误。

解决办法

以下两种方式任选其一即可:

方式一:用@LocalServerPort注入端口值

在测试类中添加@LocalServerPort注解,自动注入Spring分配的随机端口,修改后的代码如下:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class PersonEntityApplicationTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private PersonEntityRepository personRepository;

    // 新增:注入随机端口
    @LocalServerPort
    private int port;

    // 后续测试方法可直接使用port变量
    @Test
    @Order(1)
    public void testGetPersonEntityById() {
        // ... 原有代码不变
        ResponseEntity<PersonEntity> response = restTemplate.getForEntity(
"http://localhost:"  + port + "/persons/" + person.getId(), PersonEntity.class);
        // ... 原有代码不变
    }
}

方式二:直接使用TestRestTemplate的相对路径(更简洁)

TestRestTemplate在@SpringBootTest环境下已自动识别当前应用的随机端口,无需手动拼接localhost:port,直接写接口相对路径即可:

@Test
@Order(1)
public void testGetPersonEntityById() {
    // ... 原有代码
    // 直接用相对路径,无需port变量
    ResponseEntity<PersonEntity> response = restTemplate.getForEntity(
"/persons/" + person.getId(), PersonEntity.class);
    // ... 原有代码
}

@Test
@Order(2)
public void testUpdatePersonEntity() {
    // ... 原有代码
    // 直接用相对路径
    String url = "/persons/update/1";
    ResponseEntity<PersonEntity> response = restTemplate.exchange(url,
            HttpMethod.PUT,
            new HttpEntity<>(updatedPersonEntity),
            PersonEntity.class
    );
    // ... 原有代码
}

内容的提问来源于stack exchange,提问作者user29097094

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:27:21