为特定 Spring 启动测试禁用 Kafka 侦听器

Disabling Kafka Listeners for a particular Spring Boot test

如何在具有 Spring Boot (2.2+) 和 Spring Kafka (2.4+) 的应用程序中禁用 @SpringBootTest 测试中的 @KafkaListener 个实例?

目标是在特定测试中禁用 Kafka 侦听器,以便此类测试可以 运行 而无需启动嵌入式 Kafka 代理。

Spring Boot 允许通过创建自定义 TypeExcludeFilter.

从扫描中排除 类

要禁用 Kafka 侦听器,请排除所有具有 @KafkaListener@KafkaHandler:

注释方法的 类
public class KafkaListenersTypeExcludeFilter extends TypeExcludeFilter {

  private static final String KAFKA_LISTENER = "org.springframework.kafka.annotation.KafkaListener";
  private static final String KAFKA_HANDLER = "org.springframework.kafka.annotation.KafkaHandler";

  @Override
  public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
    AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
    return annotationMetadata.hasAnnotatedMethods(KAFKA_LISTENER)
        || annotationMetadata.hasAnnotatedMethods(KAFKA_HANDLER);
  }

  @Override
  public boolean equals(Object o) {
    return o != null && getClass() == o.getClass();
  }

  @Override
  public int hashCode() {
    return 1;
  }
}

@TypeExcludeFilters 注释 Spring 引导测试,并将 KafkaListenersTypeExcludeFilter 作为值:

@RunWith(SpringRunner.class)
@SpringBootTest
@TypeExcludeFilters(KafkaListenersTypeExcludeFilter.class)
public class SampleSpringBootTest {
  //...
}

Spring 注释为 @TypeExcludeFilters(KafkaListenersTypeExcludeFilter.class) 的引导测试不会启动 Kafka 侦听器,因此不需要 Kafka 代理。

当只有少数Kafka listener bean时你也可以按照建议mock listener bean Deadpool in the

@RunWith(SpringRunner.class)
@SpringBootTest
@MockBean({
    SampleKafkaListener.class
})
public class SampleSpringBootTest {
  //...
}