如何从KafkaTemplate模拟结果

时间:2019-08-13 10:02:25

标签: spring-kafka

我有一种发送kafka消息的方法,如下所示:

@Async
public void sendMessage(String topicName, Message message) {
    ListenableFuture<SendResult<String, Message >> future = kafkaTemplate.send(topicName, message);

    future.addCallback(new ListenableFutureCallback<>() {

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

        @Override
        public void onFailure(Throwable ex) {
            log.error("something wrong happened"!);
        }
    });
}

现在我正在为此编写单元测试。我还想测试两个回调方法onSuccessonFailure,所以我的想法是模拟KafkaTemplate,类似于:

KafkaTemplate kafkaTemplate = Mockito.mock(KafkaTemplate.class);

但是现在我被这两种情况的模拟结果所困扰:

when(kafkaTemplate.send(anyString(), any(Message.class))).thenReturn(????);

对于成功案例和失败案例,我应该在thenReturn方法中添加什么?请问有人有主意吗?非常感谢你!

1 个答案:

答案 0 :(得分:2)

您可以模拟模板,但最好模拟接口。

    Sender sender = new Sender();
    KafkaOperations template = mock(KafkaOperations.class);
    SettableListenableFuture<SendResult<String, String>> future = new SettableListenableFuture<>();
    when(template.send(anyString(), any(Message.class))).thenReturn(future);
    sender.setTemplate(template);
    sender.send(...);

    future.set(new SendResult<>(...));

    ...or...

    future.setException(...