我正在运行Spring Boot 2.0.1和Junit 5.我正在尝试在集成测试中获取端口。但是,端口值始终为零。我不确定是什么原因造成的。我已经尝试将web环境枚举更改为随机端口,但似乎没有任何工作。
package com.example.demo;
import org.junit.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class DemoApplicationTests {
@LocalServerPort
private int port;
@Test
public void printPort() throws Exception {
assertNotEquals(port, 0);
}
}
以下是pom(NB。仅显示依赖关系)
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<junit-jupiter.version>5.2.0</junit-jupiter.version>
<junit-platform.version>1.2.0</junit-platform.version>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
<version>${junit-platform.version}</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-engine</artifactId>
<scope>test</scope>
<version>${junit-platform.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
<version>${junit-jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
<version>${junit-jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.properties
server.port=8080
答案 0 :(得分:2)
我有同样的问题。这个解决方案对我有用:
@Service
public class TestService implements ApplicationListener<ServletWebServerInitializedEvent> {
private int localPort;
@Override
public void onApplicationEvent(final ServletWebServerInitializedEvent event) {
localPort = event.getWebServer().getPort();
}
}
您可以自动连接此服务,也可以直接在测试类中实现ApplicationListener。只是警告-Bean完全准备就绪后,将在应用程序启动期间初始化localPort变量,因此在@PostConstruct等中将不可用。
答案 1 :(得分:0)
在测试类的顶部添加@TestPropertySource(locations = "classpath:test.properties")
。您是否尝试过@Value("${server.port}")
而不是@LocalServerPort
?
答案 2 :(得分:0)
Here您可以使用RANDOM_PORT
找到示例。您可以更改为DEFINED_PORT
,只需更改webEnvironment
的值,在这种情况下,变量serverPort
的值将为8080,即默认值。
答案 3 :(得分:0)
您错过了对spring-boot-starter-web
的依赖。
答案 4 :(得分:0)
我遇到了同样的问题,下面的这组注释对我有用。没有@ContextConfiguration的端口为0。
@ContextConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestBase {
@LocalServerPort
protected int port;
}
答案 5 :(得分:0)
我有同样的问题,我正在使用junit5,我想您的问题应该是相同的。只需执行以下操作即可:
这应该可以解决问题