当前位置: 首页 > 知识库问答 >
问题:

无法在Spring Boot测试1.5中设置运行时本地服务器端口

黄靖
2023-03-14

我的应用程序使用的是Spring Boot 1.5。在集成测试中,我希望获取web服务器的运行时端口号(注意:TestRestTemplate在我的情况下并不有用)。我尝试过几种方法,但似乎没有一种有效。以下是我的方法。

第一种方法

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

@LocalServerPort      
protected int port;

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

server.port = 8081

但有了这段代码,我就错了

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

第二种方法

我变了

webEnvironment =环境。已定义_端口

网络环境 =WebEnvironment.RANDOM_PORT

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

server.port = 0

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

第三种方法

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

protected int port;

@Autowired
Environment environment

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

这将返回

第四种方法

最后,我尝试使用ApplicationEvents通过创建一个事件侦听器来查找端口号,以侦听EmbeddedServletContainerIntialize

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

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

将相同的内容添加到测试配置

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

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

protected int port;

@Autowired
EmbeddedServletContainerIntializedEventListener embeddedServletcontainerPort;

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

这将返回0。此外,我发现监听器事件从未被触发。

在文档和其他帖子中,这是非常直接的,但不知何故,它对我不起作用。非常感谢帮助。

共有3个答案

祁默
2023-03-14

您忘记在类装饰上方放置@RunWith(SpringRunner.class)

那么,试试这个。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {
     @LocalServerPort
     int randomServerPort;
     ...
}
章晋鹏
2023-03-14

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

@Bean
@Lazy(true)
public RESTClient restClient() {
   return new RESTClient(URL + port)
}
巫晋鹏
2023-03-14

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

这应该可以做到:@SpringBootTest(webEnvironment=webEnvironment.RRANDOM_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));
    }

}
 类似资料:
  • 我正在用Apache Camel路由为Spring Boot应用程序创建一些单元测试,使用Spock作为测试框架,我需要模拟来自另一个应用程序的响应。我为此制作了一个模拟控制器,但我需要将测试正在运行的端口注入一个属性。有没有方法获得测试正在运行的端口? 我试过 另外,是否有方法在文件中注入该随机端口?理想情况下,我需要在文件中执行以下操作: 其中端口是运行测试的随机端口。

  • 通过设置本地计算机、开发服务器、中间服务器或生产服务器作为测试服务器,测试动态网页或内容。 如果您计划使用服务器端语言(如 PHP)开发动态页,请设置一个测试服务器以便在您进行操作时生成并显示动态内容。 测试服务器可以是本地计算机、开发服务器、中间服务器或生产服务器。 要详细了解测试服务器的用途,请参阅 David Powers 的文章 Setting up a local testing ser

  • 问题内容: 我有去grpc服务。我正在开发Mac,塞拉利昂。在本地针对服务运行grpc客户端时,一切都很好,但是在Docker容器中针对相同服务运行相同的客户端时,出现此错误: 这是我的docker文件: 我的命令来建立图像: 我的命令启动Docker容器: 其他资讯: 客户端程序可以在Docker容器中正常运行 连接到常规的休息端点可以正常工作(http2,与grpc相关吗?) 在OS X中运行

  • 我有go grpc服务。我在mac电脑上开发,塞拉。当针对本地服务运行grpc客户机时,一切都很好,但当针对docker容器中的相同服务运行相同客户机时,我会出现以下错误: 下面是我的服务器代码片段:

  • 我正在开发一个android和iOS应用程序,需要有一个RESTful服务器端。直到今天,我在eclipse上使用Jersey和RunJettyRun,但我决定开始使用新的更好的东西!我搬到了DropWizard和IntelliJ IDEA 这些是我安装的软件和我已经处理的事情:-Java 8-Maven 3.1.1-Maven和Java的环境变量。 现在,我所做的是跟随他们网站上的DropWiz

  • 问题内容: 我正在尝试从本地网络服务器访问Active Directory。为此,我使用了最新版本的xampp和一个名为adLDAP的PHP脚本。如果我理解正确,则需要启用SSL才能访问https URL。我试着用谷歌搜索它,但是没有运气:(任何人都可以链接教程或向我解释如何在xampp / apache上为Windows 7 64bit安装SSL吗? 问题答案: Apache部分-使您能够打开h