我创建了一个简单的quarkus项目,如文档中所述。
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测试依赖项,尝试添加这里描述的集成测试:
<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$1.processRequest(AmazonLambdaRecorder.java:155)
at io.quarkus.amazon.lambda.runtime.AbstractLambdaPollLoop$1.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虚拟通道。
我是遗漏了一些初始化网络虚拟通道的东西,还是做错了什么?任何帮助都很感激!
发布于 2021-09-01 14:31:20
在深入研究夸克源之后,我发现了一个类似的集成测试示例。在与我的代码进行比较之后,我发现了application.properties中的一个不同之处
quarkus.http.virtual=true在这个标志上甚至有一个文档:
quarkus.http.virtual 如果这是真的,那么只会为vertx设置一个虚拟通道。我们有这个开关用于测试。
启用此标志后,一切都按预期开始工作!也许从夸克测试的文档中引用这个标志是有帮助的。
https://stackoverflow.com/questions/69001402
复制相似问题