【问题标题】:Is it possible to use Micronaut Declarative HTTP client in grails 4 functional API tests?是否可以在 grails 4 功能 API 测试中使用 Micronaut 声明式 HTTP 客户端?
【发布时间】:2021-03-08 17:29:02
【问题描述】:

我正在尝试创建一个声明式客户端来测试我在 grails 4 中编写的 API,就像您可以在 micronaut 中那样。

据我所知,如果您在编译时知道基本 URL,则可以创建声明式客户端。由于 grails 功能(集成)测试在随机端口上创建服务器,因此您无法事先知道该端口并使用 @Client('http://localhost:8080') 注释。

使用类似@Client('http://localhost:${local.server.port}') 的方法失败,grails 抱怨无法查找配置属性。

我有什么遗漏吗?

【问题讨论】:

  • 我知道为什么@Client('http://localhost:${local.server.port}') 不起作用,但我很惊讶它无法编译。
  • 抱歉,它可以编译。我会纠正这个问题。我的意思是抱怨,不知何故编译出来了。
  • 有道理。我认为标题中的问题和正文中的问题的答案都是“是”。

标签: grails micronaut


【解决方案1】:

是否可以在 grails 4 中使用 Micronnaut 声明式 HTTP 客户端 功能 API 测试?

是的。

这样做的一个问题是,当使用@Client('/') 连接到本地运行的服务器时,需要在上下文中配置一个EmbeddedServer bean 来回答应用程序在哪个端口上运行的问题。部分相关代码位于https://github.com/micronaut-projects/micronaut-core/blob/458bbf07221407abe7e283815fb62b7b4d1fc224/http-client-core/src/main/java/io/micronaut/http/client/DefaultLoadBalancerResolver.java#L93

我们将添加测试支持以使这更容易,但您可以通过自己注册 bean 来使其工作。请参阅以下内容:

目前这是一个杂项,但我相信在测试框架中发布适当的支持之前它会起作用。

【讨论】:

  • 谢谢杰夫!我会对此进行测试并报告。
  • 嗨,杰夫 看来我在这里缺少一些胶水。如何将 TestEmbeddedServer 添加到 beanContext?将@Singleton 放在同一个包中不起作用,将其添加到resources.groovy 中也不起作用。
  • 好的,解决了那个,我没有使用正确的Singleton注解(需要使用javax.inject.Singleton)。但是现在,TestEmbeddedServer 的端口未初始化。我看看能否找到如何访问 Micronaut 中当前的随机服务器端口。
  • 通过对 TestEmbeddedServer 的添加修复它: int getPort() { Holders.grailsApplication.mainContext.webServer.port }
  • “我看看能否找到如何访问 Micronaut 中当前的随机服务器端口” - 标有 @IntegrationTest 的测试会自动添加一个名为 serverPort 的属性。那有你想要的价值。这是在github.com/puneetbehl/grails-mn-httpclient-demo/blob/… 引用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多