当前位置: 首页 > 知识库问答 >
问题:

如何使用testcontainers和spring-Kafka准备测试

柳俊健
2023-03-14

我正在尝试为kafka消息传递设置集成测试,并从使用Embedded-Kafka转向使用TestContainers。给定docker-compose的以下配置和所有集成测试的基类:

Kafka-compose.yaml:

version: '3.3'

services:
  zookeeper:
    image: "wurstmeister/zookeeper"
  kafka:
    image: "wurstmeister/kafka:2.12-2.2.2"
    ports:
      - "9092:9092"
    depends_on:
      - "zookeeper"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_ADVERTISED_HOST_NAME: "${KAFKA_HOST:-localhost}"
      KAFKA_ADVERTISED_PORT: "9092"
      KAFKA_CREATE_TOPICS: "recoverer-test:1:1,some-topic"
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
@SpringBootTest
@Slf4j
public class IntegrationTest {
  private static final DockerComposeContainer kafkaContainer = initializeKafkaContainer();

  protected static DockerComposeContainer initializeKafkaContainer() {
    log.info(
        "Initializing kafka container. Should be called only once. Current value of the kafkaContainer: {}",
        kafkaContainer);
    try {
      var kafkaContainer =
          new DockerComposeContainer(new File("src/test/resources/kafka-compose.yml"))
              .withExposedService("kafka_1", 9092);
      kafkaContainer.start();

      var bootstrapServers =
          format(
              "PLAINTEXT://%s:%s",
              kafkaContainer.getServiceHost("kafka_1", 9092),
              kafkaContainer.getServicePort("kafka_1", 9092));

      System.setProperty("spring.embedded.kafka.brokers", bootstrapServers);

      return kafkaContainer;
    } catch (Throwable t) {
      log.error("Can't initialize the Kafka test container.", t);
      throw t;
    }
  }
  
@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
class PerformSomethingInboundAdapterTest extends IntegrationTest {

  private static final String GROUP_ID = "test-group-id";
  private static final TopicPartition PARTITION = new TopicPartition(SOME_TOPIC, 0);
  private static final Instant RECEIVED_AT = now();
  private static final CustomerNumber CUSTOMER_NUMBER = CustomerNumber.of(600830);

  @Autowired private KafkaListenerEndpointRegistry kafkaListenerRegistry;

  @Autowired private ConsumerFactory<String, String> consumerFactory;

  @Autowired private KafkaTemplate<Object, Object> kafkaTemplate;

  @MockBean private ActivateSomethingActivities activateCampaignActivities;

  private Consumer<String, String> consumer;

  private long initiallyCommittedOffset;

  @BeforeEach
  void startKafkaListener() {
    kafkaListenerRegistry.getListenerContainers().forEach(Lifecycle::start);
  }

  @AfterEach
  void stopKafkaListener() {
    kafkaListenerRegistry.getListenerContainers().forEach(Lifecycle::stop);
  }

  @Test
  void shouldPerformSomething() {
...
  }

我遇到的问题很少:

  1. 似乎spring-Kafka和它的@kafkalistener在所有可能的用@springboottest注释的测试中都是活动的,而不仅仅是在Kafka特定的测试中。这意味着发送到Kafka主题的消息可以被任意测试使用。首先,对于spring-Kafka的人来说,有一个问题:是否可以将spring-Kafka测试与测试容器一起使用?是否有可能为每个测试停止所有@kafkalistener并为特定的@springboottest测试显式启用它们
  2. TestContainers附带了一个Kafka模块。这一个使用汇合的Kafkadocker图像,这是非常顽固的配置。例如,您不能设置一些代理属性,也不能告诉容器在开始后应该创建哪个主题。经过对这个模块的努力,我决定使用带有wurstmeister/kafka图像的docker-compose模块。后一种方法的问题是,当我使用命令行maven运行测试时,我会得到错误消息,告诉kafka已经在9092端口上运行。maven似乎在MVN测试期间启动了很少的JVM,因此静态字段kafkacontainer被初始化了很少次。为什么会发生?

共有1个答案

阴福
2023-03-14
  1. 在类上使用@dirtiescontext测试完成时关闭侦听器。

2号没主意。

 类似资料:
  • 相关pom.xml 我的测试类: 我只是在试着测试数据库。 类级别上的@SQL注释不能像我的情况那样与Testcontainers初始化一起工作吗? 这里需要什么使我的两个初始脚本都运行? 我尝试使用.WithInitScript,它运行了。但是,我有很多数据要初始化,而且文件太大(而且会增长),所以我将DDL(模式)和Inserts(数据)分开。现在,我的问题是如何使用“WithInitScri

  • 我正在使用cypress来测试我的后端节点api。 我想在之前的函数中将我的数据库重置为干净状态。这包括使用axios(因此接受promise)发送帖子,放置 我熟悉cypress的commands文件(已经将其用于我的登录功能),但我似乎无法使其适用于我的“reset db”行为。 因此,我简化了这个问题,直到在“it”功能中发布我的用户,但它仍然不起作用 柏树试验: 柏树命令: 我在cypre

  • 问题内容: 是的,当我尝试在看起来像这样的变量上使用bindvalues时,我遇到了一个问题: 现在看起来像这样: 但这不起作用,还尝试了以下方法: 并得到了一些语法错误.. 正确的解决方案是什么?我还以为在bindValue(:firstname,$ firstname%)中添加%,但是我也需要在其他地方使用:firstname,也不应使用%。 帮忙谢谢 问题答案: 好的,添加到绑定值: 接着

  • 在开始使用前我们首先了解一个ToB企业在百度进行竞价推广引流到官网获客的基本流程: 为了能够获取百度搜索推广投放产生的消费、展现、点击、结合官网接入可获取广告线索产出,以支持对广告投放端到端的投放ROI评估,我们需要进行以下应用准备: 1. 在百度营销客户端对投放的目标页面URL规范UTM参数设置 在术语解释中我们也有提及UTM 参数是业界用来统一跟踪流量来源的设置,最常见的UTM参数定义如下:

  • 设计岗校招最耗费精力的就是各种测试题了,大家需要具备扎实的设计基础和良好的设计思维,这是通过测试题的基础。如果时间允许的话针对各个大厂的测试题风格和方案产出要求,需要有针对性地进行练习和准备,熟悉各种设计方向设计工具使用。 在准备测试题的过程中,需要注意以下几点: 多看各公司的测试题可以更好地了解各个公司的测试题风格和方案产出要求,同时也可以帮助你熟悉各种设计工具和软件的使用。 注重细节:测试题的