kafka集成测试用例



我对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测试用例,有人能帮我写这个吗

您想在KafkaKonfig中测试什么?IMHO这是单元测试冗余的罕见例子之一。你们做的只是初始化那个里的bean。那么,在这种情况下,单元测试会给您带来什么价值呢?

关于向Kafka推送一些东西,我想说你不会用单元测试来做,你更愿意写和集成测试(it(。通过单元测试,可以测试代码单元的内部逻辑。这意味着一个人不关心周围的环境。在您的案例中,Kafka是一个外部的东西,所以在单元测试中,您可以模拟它,而不是测试消息是否真的被推送到Kafka。您可能想看看mockito框架(https://site.mockito.org)如果我理解正确的话,在这种特殊的情况下,你不想实现什么,但总的来说可能是有用的。

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

我相信您可以在不使用对Spring的依赖的情况下嵌入Kafka实例。只要找一个例子。

最新更新