2

我正在使用带有@EmbeddedKafka注释的 Spring Kafka 来启动 Embedded kafka 实例。

依赖:

<dependency>
  <groupId>org.springframework.kafka</groupId>
  <artifactId>spring-kafka-test</artifactId>
  <scope>test</scope>
</dependency>

我已经将我的应用程序配置为连接到它:

spring:
  kafka:
    bootstrap-servers: ${spring.embedded.kafka.brokers}

我正在成功发送消息并使用消息。

我的问题是消息保留在某处,可能会出现在进行中的测试运行中。日志正在打印这些:

Successfully joined group with generation 117

高代数表示 Kafka 在测试重新运行之间保留了我不想要的信息。

如何彻底清理嵌入式 Kafka 并重新开始?

编辑:

我遇到的问题是我错误地使用了 Spring Profiles。我的嵌入式 Kafka 配置有一个自定义注释注释。问题是我@ActiveProfiles("kafka")在复合注释中设置,也在@ActiveProfiles("dev")实际测试类中设置。我已将复合注释更新为:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
// @ActiveProfiles("kafka") REMOVED
@TestPropertySource(properties = "spring.kafka.bootstrap-servers=${spring.embedded.kafka.brokers}")
@EmbeddedKafka(/* config properties */)
public @interface CustomEmbeddedKafka{
}
4

1 回答 1

3

您需要@DirtiesContext在测试之间使用来清理应用程序上下文。与此同时,嵌入式 Kafka 代理也将被销毁。

如果问题是在一个测试类方法之间,那么你需要重新考虑那里的逻辑,不要在不同的方法中干扰相同的主题。

您也可以考虑使用@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD),但这将导致某种性能下降,因为在每个测试方法之前都将重新创建应用程序上下文和嵌入式 Kafka。

更新

试试这个建议而不是application.properties修改:

static {
    System.setProperty(EmbeddedKafkaBroker.BROKER_LIST_PROPERTY,
            "spring.kafka.bootstrap-servers");
}

https://docs.spring.io/spring-kafka/docs/2.2.5.RELEASE/reference/#kafka-testing-embeddedkafka-annotation

于 2019-04-10T15:08:35.647 回答