没有可用于 quarkus 测试 amazon lambda 的虚拟通道

No virtual channel available for quarkus test amazon lambda

我创建了一个简单的 quarkus lambda rest 项目,如 documentation

中所述
mvn archetype:generate \
       -DarchetypeGroupId=io.quarkus \
       -DarchetypeArtifactId=quarkus-amazon-lambda-rest-archetype \
       -DarchetypeVersion=2.2.1.Final

我只保留了以下资源的 JAXRS 内容:

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello jaxrs";
    }
}

然后我尝试通过首先添加 lambda 测试依赖项来添加 here 所述的集成测试:

<dependency>
   <groupId>io.quarkus</groupId>
   <artifactId>quarkus-test-amazon-lambda</artifactId>
   <scope>test</scope>
</dependency>

然后我按照描述添加了 application.properties,其中包含 quarkus.lambda.enable-polling-jvm-mode=true

最后,我添加了一个简单的测试用例:

@QuarkusTest
public class GreetingTest
{
    @Test
    public void testSimpleLambdaSuccess() {
        InputStream inputStream = Objects.requireNonNull(
                GreetingTest.class.getResourceAsStream("/request.json")
        );

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        LambdaClient.invoke(inputStream, outputStream);
    }
}

request.json 文件是我使用 sam local generate-event apigateway aws-proxy 生成的事件,只是修复了路径以匹配我的资源(尽管这对以下问题没有影响)。

但是当我运行测试时,我总是得到以下错误:

2021-08-31 17:09:10,108 WARN  [io.net.res.dns.DnsServerAddressStreamProviders] (vert.x-eventloop-thread-5) Can not find io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider in the classpath, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS.
2021-08-31 17:09:10,604 INFO  [io.quarkus] (main) Quarkus 2.2.1.Final on JVM started in 1.867s. Listening on: http://localhost:8081
2021-08-31 17:09:10,604 INFO  [io.quarkus] (main) Profile test activated. 
2021-08-31 17:09:10,604 INFO  [io.quarkus] (main) Installed features: [amazon-lambda, cdi, resteasy, security, smallrye-context-propagation]
2021-08-31 17:09:10,960 ERROR [qua.ama.lam.http] (Lambda Thread) Request Failure: java.lang.RuntimeException: No virtual channel available
    at io.quarkus.netty.runtime.virtual.VirtualClientConnection.connect(VirtualClientConnection.java:113)
    at io.quarkus.amazon.lambda.http.LambdaHttpHandler.nettyDispatch(LambdaHttpHandler.java:204)
    at io.quarkus.amazon.lambda.http.LambdaHttpHandler.handleRequest(LambdaHttpHandler.java:61)
    at io.quarkus.amazon.lambda.http.LambdaHttpHandler.handleRequest(LambdaHttpHandler.java:41)
    at io.quarkus.amazon.lambda.runtime.AmazonLambdaRecorder.processRequest(AmazonLambdaRecorder.java:155)
    at io.quarkus.amazon.lambda.runtime.AbstractLambdaPollLoop.run(AbstractLambdaPollLoop.java:80)
    at java.base/java.lang.Thread.run(Thread.java:832)

{"statusCode":500,"multiValueHeaders":{"Content-Type":["application/json"]},"body":"{ \"message\": \"Internal Server Error\" }","isBase64Encoded":false}

我尝试通过堆栈跟踪进行一些调试,看起来实际上没有注册 netty 虚拟通道。

我是不是遗漏了初始化 netty 虚拟频道的东西,还是我做错了什么?任何帮助表示赞赏!

在挖掘 quarkus 资源后,我发现了一个类似的集成测试示例。将其与我的代码进行比较后,我发现 application.properties:

有一处不同
quarkus.http.virtual=true

这个flag上还有一个documentation:

quarkus.http.virtual

If this is true then only a virtual channel will be set up for vertx web. We have this switch for testing purposes.

启用此标志后,一切开始按预期工作!从 quarkus 测试文档中引用此标志可能会有所帮助。