如何隔离后续的 Camel Spring-Boot 测试套件

How to isolate subsequent Camel Spring-Boot test suites

提问人:Ulrich Schuster 提问时间:11/15/2023 最后编辑:Ulrich Schuster 更新时间:11/15/2023 访问量:24

问:

我想测试我的 Spring-Boot/Camel 应用程序(Camel 4.1、Spring-Boot 3.1.5、JUnit5),其中包括 Kafka 消费者和/或生产者。我已经编写了几个 JUnit 测试套件。当我连续运行这些测试套件时,我看到几个 Camel 上下文正在启动,并且 Kafka 使用者 (clientId=BusinessEventConsumer) 似乎被多次启动:

// First test suite
INFO  AbstractCamelContext:2415 - Apache Camel 4.1.0 (camel-1) is starting
...
// Second test suite
INFO  AbstractCamelContext:2415 - Apache Camel 4.1.0 (camel-2) is starting
WARN  AppInfoParser:68 - Error registering AppInfo mbean
javax.management.InstanceAlreadyExistsException: kafka.producer:type=app-info,id=BusinessEventConsumer
...
etc.

我想这些多个 Kafka 消费者是我在测试用例中遇到错误的原因。生产者也是如此。

如何隔离我的测试套件,以便 Camel Kafka 组件不会多次启动?

我的测试类是这样注释的(Kotlin 代码):

@CamelSpringBootTest
@SpringBootTest(
    classes = [TestApplication::class],
    properties = ["camel.springboot.java-routes-include-pattern=**/TestEventProducerRoute, **/BusinessEventSubscriberRoute"]
)
@Import(TestEnvironmentConfiguration::class)
@DisableJmx(true)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
internal class OutboundDirectTest(...){..}

编辑:在执行测试期间查看正在运行和等待的线程时,我看到第一个和第二个测试套件都有 RUNNING 使用者线程和 WAITING 生产者线程,如下所示:

camel-1 thread #1 - KafkaConsumer in group "main": RUNNING
camel-1 thread #2 - KafkaProducer in group "main": WAITING
camel-1 thread #3 - KafkaProducer in group "main": WAITING
...
camel-2 thread #10 - KafkaConsumer in group "main": RUNNING
camel-2 thread #11 - KafkaProducer in group "main": WAITING
...

为什么会这样?我假设在第二个测试上下文开始之前,与第一个测试类相关的 Spring/Camel 上下文将完全关闭,包括所有 Kafka 消费者和生产者线程(我没有并行运行测试)。另外,为什么在测试类中为每个测试创建一个单独的 KafkaProducer 线程?

如何确保在启动新的测试上下文之前完全关闭与一个测试类相关的 Camel 上下文?

apache-camel junit5 spring-boot-test spring-camel

评论

0赞 Ulrich Schuster 11/15/2023
也许原因与这个骆驼错误有关,该错误在前段时间已解决?也许有问题的功能已经重新引入,现在阻止正确关闭包含 Kafka 使用者的 Camel 路由

答: 暂无答案