Spring Boot Test无法使用LocalServerPort批注自动装配端口

时间:2018-05-08 17:38:41

标签: java spring-boot junit5 spring-boot-test

我正在运行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

6 个答案:

答案 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,我想您的问题应该是相同的。只需执行以下操作即可:

  • 删除“导入org.junit.Test”;
  • 重新导入“导入org.junit.jupiter.api.Test”;

这应该可以解决问题