测试之间的嵌入式 Kafka 刷新消息
Embedded Kafka Refresh Messages Between Tests
我正在使用带有 @EmbeddedKafka
注释的 Spring Kafka 来启动嵌入式 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 配置文件。我的嵌入式 Kafka 配置有一个自定义注释注释。问题是我在复合注释中设置了 @ActiveProfiles("kafka")
,并且在实际测试中设置了 @ActiveProfiles("dev")
class。我已将复合注释更新为:
@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{
}
您需要使用 @DirtiesContext
在测试之间清理应用程序上下文。与此同时,嵌入式 Kafka 代理也将被销毁。
如果问题出在一个测试class方法之间,那么你需要重新思考那边的逻辑,不要在不同的方法中干扰相同的主题。
您也可以考虑使用 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
,但这会导致某种性能下降,因为在每个测试方法之前将重新创建应用程序上下文和嵌入式 Kafka。
更新
试试这个建议而不是 application.properties
修改:
static {
System.setProperty(EmbeddedKafkaBroker.BROKER_LIST_PROPERTY,
"spring.kafka.bootstrap-servers");
}
我正在使用带有 @EmbeddedKafka
注释的 Spring Kafka 来启动嵌入式 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 配置文件。我的嵌入式 Kafka 配置有一个自定义注释注释。问题是我在复合注释中设置了 @ActiveProfiles("kafka")
,并且在实际测试中设置了 @ActiveProfiles("dev")
class。我已将复合注释更新为:
@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{
}
您需要使用 @DirtiesContext
在测试之间清理应用程序上下文。与此同时,嵌入式 Kafka 代理也将被销毁。
如果问题出在一个测试class方法之间,那么你需要重新思考那边的逻辑,不要在不同的方法中干扰相同的主题。
您也可以考虑使用 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
,但这会导致某种性能下降,因为在每个测试方法之前将重新创建应用程序上下文和嵌入式 Kafka。
更新
试试这个建议而不是 application.properties
修改:
static {
System.setProperty(EmbeddedKafkaBroker.BROKER_LIST_PROPERTY,
"spring.kafka.bootstrap-servers");
}