使用 kafka testcontainer 的 Quarkus 单元测试永远卡住

问题描述

我的 Quarkus 单元测试:

@QuarkusTest
@QuarkusTestResource(KafkaResource.class)
public class CreditStatusUnitTest {

    @Test
    public void testCreditStatus() {
        given().when()
                .request()
                .contentType(ContentType.JSON)
                .body("{hello: world}")
                .post("/CreditStatus")
                .then().statusCode(200)
                .body(is("{\"code\":200,\"message\":\"success\"}"));
    }
}

/CreditStatus api 接收 POST 消息并将其发送给 kafka,然后返回 HTTP 200。

我的kafka测试资源类:

public class KafkaResource implements QuarkusTestResourceLifecycleManager {

    private final KafkaContainer kafka = new KafkaContainer();

    @Override
    public Map<String,String> start() {
        kafka.start();
        return Collections.singletonMap("kafka.bootstrap.servers",kafka.getBootstrapServers());
    }

    @Override
    public void stop() {
        kafka.close();
    }
}

src/main/resources/application.properties 中的 Kafka 配置:

%dev.kafka.bootstrap.servers=localhost:9092
%test.kafka.bootstrap.servers=${KAFKA_BOOTSTRAP:localhost:9092}
%prod.kafka.bootstrap.servers=${KAFKA_BOOTSTRAP:localhost:9092}
mp.messaging.outgoing.credit-status-out.connector=smallrye-kafka
mp.messaging.outgoing.credit-status-out.topic=credit-status
mp.messaging.outgoing.credit-status-out.value.serializer=org.apache.kafka.common.serialization.StringSerializer
mp.messaging.outgoing.credit-status-out.health-readiness-enabled=true
mp.messaging.outgoing.credit-status-out.health-enabled=true
mp.messaging.connector.smallrye-kafka.client.id=my-credit-status-client

在 pom.xml 中测试容器依赖:

<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>testcontainers</artifactId>
  <version>1.15.3</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>kafka</artifactId>
  <version>1.15.3</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>junit-jupiter</artifactId>
  <version>1.15.3</version>
  <scope>test</scope>
</dependency>

当我通过以下方式运行此测试时:

mvn -Dtest=CreditStatusUnitTest test

它永远卡住了:

...
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.....CreditStatusUnitTest
Jun 30,2021 12:33:21 PM org.jboss.threads.Version <clinit>
INFO: JBoss Threads version 3.2.0.Final-redhat-00003
Jun 30,2021 12:33:22 PM io.quarkus.micrometer.deployment.binder.mpmetrics.MicroprofileMetricsProcessor logWarningForMpMetricsUsage
WARN: This application uses the MP Metrics API. The micrometer extension currently provides a compatibility layer that supports the MP Metrics API,but metric names and recorded values will be different. Note that the MP Metrics compatibility layer will move to a different extension in the future.
Jun 30,2021 12:33:22 PM io.quarkus.arc.processor.BeanArchives index
WARN: Failed to index int: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader

如果我注释掉 @QuarkusTestResource(KafkaResource.class),测试使用我的本地 kafka 实例并且工作正常。我发现当 localhost:9092 的 kafka 实例不可用时,我的应用程序无法启动,不确定是否是这个原因。

在这里错过了什么?如何告诉 Quarkus 与应用程序一起启动 Kafka testcontainer 并使用 kafka testcontainer 地址和端口替换 application.properties 中的配置?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)