Home > Mobile >  Can MockProducer and MockConsumer be used with kafkaTemplate producer
Can MockProducer and MockConsumer be used with kafkaTemplate producer

Time:01-05

I have a service which using kafkaTemplate to send the kafka message.

@Service
class KafkaProducer(@Autowired val kafkaTemplate: KafkaTemplate<String, String>) {


final fun sendMessage(msg: String) {
    val abc = kafkaTemplate.send(AppConstants.TOPIC_NAME, "abc", msg)

    abc.whenComplete {
            result, ex ->
        if (ex != null) {
            print("ex occured")
            print(ex.message)
        } else {
            print("sent successfully")
            print(result.producerRecord.value())
        }
    }
}

}

For unit test, I am trying to mock this KafkaProducer.

Can i use MockProducer (import org.apache.kafka.clients.producer.MockProducer) for this?

   @Test
fun verify_test() {
    val mockProducer = MockProducer(true,StringSerializer(), StringSerializer())
    val kafkaProducer = KafkaProducer(mockProducer)

}

On trying the above code, i am getting error bcoz KafkaProducer takes argument as KafkaTemplate object, and I am providing MockProducer.

CodePudding user response:

Here is an example using a mock ProducerFactory...

@SpringJUnitConfig
class So74993413ApplicationTests {

    @Test
    void test(@Autowired KafkaTemplate<String, String> template,
            @Autowired MockProducer<String, String> producer) throws Exception {

        CompletableFuture<SendResult<String, String>> future = template.send("foo", "bar");
        SendResult<String, String> sendResult = future.get();
//      System.out.println(sendResult);
        List<ProducerRecord<String, String>> history = producer.history();
        assertThat(history).hasSize(1);
        ProducerRecord<String, String> record = history.get(0);
        assertThat(record.topic()).isEqualTo("foo");
        assertThat(record.value()).isEqualTo("bar");
    }

    @Configuration
    public static class Config {

        @Bean
        MockProducer<String, String> producer() {
            return new MockProducer<>(true, new StringSerializer(), new StringSerializer());
        }

        @Bean
        ProducerFactory<String, String> pf (MockProducer producer) {
            return new ProducerFactory<>() {

                @Override
                public Producer<String, String> createProducer() {
                    return producer;
                }

            };
        }

        @Bean
        KafkaTemplate<String, String> template(ProducerFactory<String, String> pf) {
            return new KafkaTemplate<>(pf);
        }

    }

}

CodePudding user response:

KafkaTemplate is not a type of Producer. Native Kafka classes cannot be used in place of Spring's - that'd be a reverse dependency.

You would have to mock the template instead since that's what you're actually using. By doing so, it'll bypass any KafkaProducer instance the template used, mock or not.

  • Related