嵌入式Kafka生产者测试

时间:2019-09-17 21:25:02

标签: integration-testing spring-kafka

我正在编写集成测试以测试kafka生产者。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {kafkaProducerConfig.class, KafkaProducerIT.InnerConfig.class})
@EnableConfigurationProperties(KafkaProducerInfo.class)
@ComponentScan(basePackages = "...")
public class KafkaProducerIT {

    @ClassRule
    public static EmbeddedKafkaRule embeddedKafka = new EmbeddedKafkaRule(1, true, "testtopic");

    @Autowired
    CustomKafkaProducer<String, String> KafkaProducer;

    @Autowired
    KafkaController kafkaController;

    @Test
    public void whenSendMessage_thenConsumeIt() throws InterruptedException {
        KafkaProducer.produceMessageToKafkaTopic("ahahahwow", "testtopic");
        kafkaController.countDownLatch.await();
    }

    @Configuration
    public static class InnerConfig {

        @Bean
        public KafkaListenerContainerFactory<?> kafkaListenerContainerFactory(ConsumerFactory<String, Object> replyConsumerFactory) {
            ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
            factory.setConsumerFactory(replyConsumerFactory);
            factory.setBatchListener(true);
            return factory;
        }

        @Bean
        KafkaController kafkaController() {
            return new KafkaController();
        }

    }

    public static class KafkaController {

        CountDownLatch countDownLatch = new CountDownLatch(1);

        @KafkaListener(topics = "testtopic")
        public void listen(final String payload) {
            countDownLatch.countDown();
        }
    }

}

想法是我想向主题发送消息,使用KafkaControllerCountDownLatch阅读。 我遇到的问题是,CountDownLatch永远不会触发,测试只会挂在await上。

CustomKafkaProducer只是一个在内部使用常规kafkaTemplate的包装器。

p.s。

在调试期间,有几种情况下流进入侦听器并通过测试。因此问题与主题名称错误等无关。

1 个答案:

答案 0 :(得分:0)

您需要为使用者设置auto.offset.reset =最早。默认值为最新,因此如果使用者在发送记录后开始,则会出现竞争状况。