0

我对 junit 测试用例很陌生,我想为 kafka 集成编写 junit。下面是我的代码

@EnableKafka
@Configuration
public class KafkaConfiguration {
    
    @Value("${bts_config}")
    private String bts_config;
        
    @Value("${grpname}")
    private String grpname;

    @Bean
    public ProducerFactory<String, String> producerFactory() throws URISyntaxException{
        Map<String, Object> config = new HashMap<>();
        config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bts_config);
        config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        config.put("security.protocol", "SSL");
        config.put("ssl.protocol", "SSL");
        
        config.put("ssl.truststore.location", "/dan/client.truststore.jks");
        config.put("ssl.endpoint.identification.algorithm", "https");
        return new DefaultKafkaProducerFactory(config);
    }

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() throws URISyntaxException {
        return new KafkaTemplate<String, String>(producerFactory());
    }
}

在其他课程中,我有一种方法可以使用 kafkaTemplate 将消息发送到 kafka

public void pushMsgsKafaka(String topicName, String msg) {
        ListenableFuture<SendResult<String, String>> future =  kafkaTemplate.send(topicName, msg);
        future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {

            @Override
            public void onSuccess(SendResult<String, String> result) {
                //success
            }

            @Override
            public void onFailure(Throwable ex) {
                LOGGER.error("Unable to send message=[" 
                         + msg + "] due to : " + ex.getMessage());
            }

        });
}

现在我想为方法编写测试用例KafkaConfig (@EnableKafka, @Configuration)和测试用例public void sendDataToKafka(String topicName, String msg)

我是编写junit测试用例的新手,有人可以帮我吗

4

1 回答 1

0

您究竟想在 KafkaKconfig 中测试什么?恕我直言,这是单元测试多余的罕见示例之一。你做的只是在那里初始化 bean。那么在这种情况下,单元测试会给你带来什么价值呢?

关于向 Kafka 推送一些东西,我想说你不会用单元测试来做,你宁愿编写和集成测试(IT)。使用单元测试可以测试代码单元的内部逻辑。意思是不关心周围的环境。在您的情况下,Kafka 是一个外部事物,因此在单元测试中您模拟它而不是测试消息是否真的被推送到 Kafka。你可能想看看 mockito framework for mocking ( https://site.mockito.org ) 如果我理解正确,这不是你想要在这种特殊情况下实现的目标,但一般来说可能很有用。

如果您想测试消息是否真的被推送到 Kafka,那么您实际上是想编写 IT 而不是单元测试。您的 IT 的“问题”部分是您实际上不想将消息推送到共享的 Kafka 实例,因为您的测试可能会干扰其他测试在同一个 Kafka 实例上执行的操作(类似于数据库)。例如,如果您在您的机器上运行测试,而其他人将在同一个 Kafka 实例上运行相同的测试,您的结果可能会受到影响。因此,您可能希望为您的 IT 运行嵌入式 Kafka 实例。(同样,如果您想测试与 DB 的交互,那么每次测试运行都需要一个单独的 DB 实例)一旦您使用 Spring,您可能希望查看 Spring 框架引入的嵌入式 Kafka。 https://codenotfound.com/spring-kafka-embedded-unit-test-example.html

我相信您可以在不依赖 Spring 的情况下嵌入 Kafka 实例。随便找个例子。

于 2020-07-29T19:31:31.080 回答