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

使用属性服务器运行spock测试时如何查找Spring Boot容器的端口。port=0

裴实
2023-03-14

给定application.properties中的此条目:

server.port=0

这会导致Spring Boot选择一个随机的可用端口,并且使用spock测试Spring Boot web应用程序,spock代码如何知道要命中哪个端口?

像这样的正常注射:

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

对斯波克不起作用。

共有1个答案

夏侯俊美
2023-03-14

您可以使用以下代码找到端口:

int port = context.embeddedServletContainer.port

对于那些对java等价物感兴趣的人来说,它是:

int port = ((TomcatEmbeddedServletContainer)((AnnotationConfigEmbeddedWebApplicationContext)context).getEmbeddedServletContainer()).getPort();

下面是一个可以扩展的抽象类,它封装了Spring Boot应用程序的初始化并确定了端口:

abstract class SpringBootSpecification extends Specification {

    @Shared
    @AutoCleanup
    ConfigurableApplicationContext context

    int port = context.embeddedServletContainer.port

    void launch(Class clazz) {
        Future future = Executors.newSingleThreadExecutor().submit(
                new Callable() {
                    @Override
                    public ConfigurableApplicationContext call() throws Exception {
                        return (ConfigurableApplicationContext) SpringApplication.run(clazz)
                    }
                })
        context = future.get(20, TimeUnit.SECONDS);
    }
}
class MySpecification extends SpringBootSpecification {
    void setupSpec() {
        launch(MyLauncher.class)
    }

    String getBody(someParam) {
        ResponseEntity entity = new RestTemplate().getForEntity("http://localhost:${port}/somePath/${someParam}", String.class)
        return entity.body;
    }
}
 类似资料:
  • 我正在用Spock测试一个Spring Boot应用程序,但是在其中一个测试案例中,我需要模拟或存根对身份验证服务器的调用(使用oauth 2),所以我试图将请求重定向到一个虚拟服务器进行测试,并使方法返回一个固定的代币。但是,我在运行时覆盖端口,但我得到一个错误,因为虚拟服务器是在一个固定的端口(从读取),有没有办法在运行时改变这一点,使服务器匹配随机运行测试的端口?这是我的函数: 当我调试这个

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

  • 我想在Linux上的Azure应用服务(容器的网络应用)上使用scrapinghub/spash容器。 但是部署上的docker run命令会随机更改容器端的绑定端口(请参阅下面的日志,端口8961会自动分配。此数字每次部署都有所不同) 2020-01-21 08:56:47.494信息-docker run-d-p 8961:8050-名称b2scraper-splash\u 3\u d89ce

  • 问题内容: 使用以下选项启动Java应用程序时: Java使用临时端口,这对于避免冲突非常有用。 是否可以从应用程序内部以编程方式获取实际端口(或连接URL)? 问题答案: 这将打印如下网址

  • 我有一个服务器,用Java编写的,那是我的应用程序,我想在上面运行一些测试。我正在使用gradle来管理依赖项和构建任务等,所以我也想在这方面使用它。我需要启动服务器,然后运行我的单元测试,这会对它发出一堆HTTP请求,然后在测试完成后,理想情况下甚至关闭服务器。所以我尝试在build.gradle中添加(jettyRunWar是运行服务器的工具),但我想这太简单了,因为从不从jettyRunWa

  • 问题内容: 我想要一个PHP脚本,它允许您ping IP地址和端口号()。我找到了类似的脚本,但是它仅适用于网站,而不适用于。 我想要一个游戏服务器。 这个想法是我可以输入IP地址和端口号,然后得到ping响应。 问题答案: 我认为这个问题的答案几乎可以概括您的问题。 如果您要查找给定主机是否将在端口80上接受TCP连接,则可以执行以下操作: 对于TCP以外的任何其他东西,都会更加困难(尽管由于您