无法在弹簧引导测试 1.5 中设置运行时本地服务器端口

2022-09-03 12:32:09

我正在为我的应用程序使用Spring Boot 1.5。在集成测试中,我想获取Web服务器的运行时端口号(注意:TestRestTemplate在我的情况下没有用。我尝试过一些方法,但似乎都不起作用。以下是我的方法。

第一种方法

@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {

@LocalServerPort      
protected int port;

在我的文件中,我已将服务器端口定义为src/main/resources/config/application.properties

服务器.端口 = 8081

但是有了这个代码,我得到了错误

无法解析值“${local.server.port}”中的占位符“local.server.port”

第二种方法

我变了

网站环境 =WebEnvironment.DEFINED_PORT

网站环境 =WebEnvironment.RANDOM_PORT

在我的文件中,我已经定义了src/main/resources/config/application.properties

服务器端口 = 0

这将引发与第一种方法相同的错误。

第三种方法

在第三种方法中,我试图使用

protected int port;

@Autowired
Environment environment

this.port = this.environment.getProperty("local.server.port");

这将返回值null

第四种方法

最后,我尝试通过创建要侦听的事件侦听器来查找端口号。ApplicationEventsEmbeddedServletContainerIntialize

@EventListener(EmbeddedServletContainerInitializedEvent.class)
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
this.port = event.getEmbeddedServletContainer().getPort();
}

public int getPort() {
return this.port;
} 

已添加到TestConfig

现在,在我的测试类中,我尝试使用此侦听器来获取端口

@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.RANDOM_PORT)
public class RestServiceTest {

protected int port;

@Autowired
EmbeddedServletContainerIntializedEventListener embeddedServletcontainerPort;

this.port = this.embeddedServletcontainerPort.getPort();

这将返回 .另外,我发现监听器事件从未触发过。0

它非常直接,就像在文档和其他帖子中一样,但不知何故,它不适合我。非常感谢您的帮助。


答案 1

也许您忘记为测试 Web 环境配置随机端口。

这应该可以解决问题:@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

下面是一个刚刚在 Spring Boot 1.5.2 中成功执行的测试:

import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class RandomPortTests {

    @Value("${local.server.port}")
    protected int localPort;

    @Test
    public void getPort() {
        assertThat("Should get a random port greater than zero!", localPort, greaterThan(0));
    }

}

答案 2

我在使用spring boot 1.4的应用程序上遇到了同样的问题,并发现事件有点延迟 - 这意味着在我的bean初始化后会触发它 - 所以为了解决这个问题,我需要在bean上使用懒惰的注释,它需要使用端口,例如RestClient Bean并且它工作了。例:EmbeddedServletContainerInitializedEvent

@Bean
@Lazy(true)
public RESTClient restClient() {
   return new RESTClient(URL + port)
}