如何模拟 KafkaTemplate 的结果
How to mock result from KafkaTemplate
我有一个像这样发送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"!);
}
});
}
现在我正在为它编写单元测试。我还想测试两个回调方法 onSuccess
和 onFailure
方法,所以我的想法是模拟 KafkaTemplate,比如:
KafkaTemplate kafkaTemplate = Mockito.mock(KafkaTemplate.class);
但现在我陷入了这两种情况的模拟结果:
when(kafkaTemplate.send(anyString(), any(Message.class))).thenReturn(????);
对于案例成功和案例失败,我应该在 thenReturn
方法中输入什么?有人有想法吗?非常感谢!
您可以模拟模板,但最好模拟界面。
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(...
我有一个像这样发送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"!);
}
});
}
现在我正在为它编写单元测试。我还想测试两个回调方法 onSuccess
和 onFailure
方法,所以我的想法是模拟 KafkaTemplate,比如:
KafkaTemplate kafkaTemplate = Mockito.mock(KafkaTemplate.class);
但现在我陷入了这两种情况的模拟结果:
when(kafkaTemplate.send(anyString(), any(Message.class))).thenReturn(????);
对于案例成功和案例失败,我应该在 thenReturn
方法中输入什么?有人有想法吗?非常感谢!
您可以模拟模板,但最好模拟界面。
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(...