Micronaut 随机端口无法启动测试

Micronaut Random Port fails to start Tests

我维护着一个相当大的 micronaut 应用程序,其中包含数千个测试。最近我迁移到 Azure 并开始看到这些不稳定的测试并出现此错误

Test initializationError FAILED

io.micronaut.http.server.exceptions.ServerStartupException: Unable to start Micronaut server on port: 43218

申请-test.yml

---
micronaut:
  server:
    port: ${random.port}

示例测试

@MicronautTest 
class MathServiceSpec extends Specification {

   @Inject
   MathService mathService 

   @Unroll
   void "should compute #num times 4"() { 
       when:
       def result = mathService.compute(num)

       then:
       result == expected

       where:
       num | expected
       2   | 8
       3   | 12
   }

我看不出有任何明显的原因可以解释为什么 micronaut 选择一个端口用于 random.port,或者为什么这只是在迁移到 Azure 之后才开始发生,因为我无法建立明显的联系。

似乎 micronaut 使用的是有问题的已弃用的 SocketUtils https://github.com/micronaut-projects/micronaut-core/blob/5a8a7a7318d0f041f5fdfb667a9da5af1860a8e2/inject/src/main/java/io/micronaut/context/env/PropertySourcePropertyResolver.java#L595

发布来自 Spring 的报告 https://github.com/spring-projects/spring-framework/issues/28052

我相信这就是问题所在。

为了清楚地描述我的问题: gradle 测试任务完成后不久,端口开始关闭,但不是立即关闭。发生这种情况是因为我的管道的 autoCancel 功能,因为我已经对该 PR 进行了另一次提交,因此我的管道取消了之前的构建。因为 gradle 守护进程被强行杀死,所以端口有机会被使用,而 micronaut 会免费使用这个端口,因为它使用了 Spring SocketUtils 的副本,现在正是因为这个错误而弃用了。禁用 autoCancel 可以解决这个问题,但意味着我需要完成构建才能在下一次提交时开始下一个构建,这基本上是在浪费我的时间或构建代理。

 micronaut:
  server:
    port: -1

帮我解决了问题