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
相关产品推荐
相关产品推荐

