单元测试ListenableFuture kafkaTemplate.send始终返回null [英] unit testing ListenableFuture kafkaTemplate.send always returns null
问题描述
我正在尝试对来自kafkaTemplate.send()的回调进行单元测试,但其无法正常工作.这是我要测试的代码片段.
I'm trying to unit test the callbacks from the kafkaTemplate.send() but its not working as expected. here's the code snippet of the code im trying to test.
@Override
public void sendMessage(String topicName, String message) {
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topicName, message);
future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
@Override
public void onSuccess(SendResult<String, String> result) {
System.out.print("Success")
}
@Override
public void onFailure(Throwable ex) {
System.out.print("Failed")
}
});
}
这是单元测试代码
private KafkaTemplate<String, String> kafkaTemplate;
private KafkaService kafkaService;
private SendResult<String, String> sendResult;
private ListenableFuture<SendResult<String, String>> future;
private RecordMetadata recordMetadata
private String topicName
private String message
def setup() {
kafkaTemplate = Mock(KafkaTemplate.class)
kafkaService = new KafkaService(kafkaTemplate);
topicName = "test.topic"
message = "test message"
sendResult = Mock(SendResult.class);
future = Mock(ListenableFuture.class);
recordMetadata = new RecordMetadata(new TopicPartition(topicName, 1), 1L, 0L, 0L, 0L, 0, 0);
}
def "Test success send message method"() {
given:
sendResult.getRecordMetadata() >> recordMetadata
kafkaTemplate.send(_ as String, _ as String) >> future
when:
kafkaService.sendMessage(topicName, message)
then:
// catch success or failed here.
1 * kafkaTemplate.send(_,_) >> {arguments ->
final String topicNameParam = arguments.get(0)
final String messageParam = arguments.get(1)
assert topicNameParam == topicName
assert messageParam == message
}
}
基于调试器的将来,在这种情况下为空
based on the debugger future is null on this scenario
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topicName, message); // future null
future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() { // future null
我在这里已经阅读了很多答案,但是并不能解决问题,或者他们还没有很好地解释我会明白问题出在哪里.像这样的 https://stackoverflow.com/a/56677098
i already read a lot of answers here but it does not solved the issue or havent they explain it well that i would understand where the problem is. like this one https://stackoverflow.com/a/56677098
感谢您的提前帮助!
推荐答案
You are making a typical Spock beginner's mistake when trying to combine mocking and stubbing: First declare a stub result in the given:
block and later a checked mock interaction (without stub result) in the then:
block. But mocking and stubbing always have to happen in the same interaction as described in the manual chapter I linked to. The manual also explains that the interaction in the then:
block wins in your case, i.e. because you do not specify a stub result there, the result will default to null
.
此外,您使论证验证变得比必需的困难得多.只需使用简单的参数约束即可.如果您这样更改测试,则该测试将通过:
Furthermore, you make the argument verification much more difficult than necessary. Just use simple argument constraints instead. Your test will pass if you change it like this:
def "Test success send message method"() {
given:
sendResult.getRecordMetadata() >> recordMetadata
// kafkaTemplate.send(_ as String, _ as String) >> future
when:
kafkaService.sendMessage(topicName, message)
then:
// catch success or failed here.
1 * kafkaTemplate.send(topicName, message) >> future
}
这篇关于单元测试ListenableFuture kafkaTemplate.send始终返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!