gpt4 book ai didi

unit-testing - 如何编写单元测试用例来为 ListenableFuture 添加回调

转载 作者:行者123 更新时间:2023-12-03 13:51:01 25 4
gpt4 key购买 nike

我正在尝试为 ListenableFuture 添加回调编写单元测试用例,但我不知道该怎么做。在互联网上没有得到任何有用的东西。

 @Test
public void can_publish_data_to_kafka() {
String topic = someString(10);
String key = someAlphanumericString(5);
String data = someString(50);
SendResult sendResult = mock(SendResult.class);
ListenableFuture<SendResult<String, Object>> future = mock(ListenableFuture.class);

given(kafkaTemplate.send(topic, key, data)).willReturn(future);

doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
return invocationOnMock.getArguments()[1];
}
});

service.method(key, topic, data);

}

我想为其编写测试用例的代码
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topicName, key, data);

future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
@Override
public void onSuccess(SendResult<String, Object> stringKafkaBeanSendResult) {
RecordMetadata recordMetadata = stringKafkaBeanSendResult.getRecordMetadata();
LOGGER.info(String.format("sent message %s to topic %s partition %s with offset %s" + data.toString(), recordMetadata.topic(), recordMetadata.partition(), recordMetadata.offset()));
}

@Override
public void onFailure(Throwable throwable) {
LOGGER.error(String.format("unable to send message = %s to topic %s because of error %s" + data.toString(), topicName, throwable.getMessage()));
}
});

我期待着一个方向,我应该朝着使用 mockito 编写 UT 的方向发展。

最佳答案

您可以编写这样的测试用例。

    @Test
public void can_publishDataToKafka() {
String key = someAlphanumericString();
String topic = someAlphaString(10);
long offset = somePositiveLong();
int partition = somePositiveInteger();

SiebelRecord siebelRecord = mock(SiebelRecord.class);
SendResult<String, Object> sendResult = mock(SendResult.class);
ListenableFuture<SendResult<String, Object>> responseFuture = mock(ListenableFuture.class);
RecordMetadata recordMetadata = new RecordMetadata(new TopicPartition(topic, partition), offset, 0L, 0L, 0L, 0, 0);

given(sendResult.getRecordMetadata()).willReturn(recordMetadata);
when(kafkaTemplate.send(topic, key, siebelRecord)).thenReturn(responseFuture);
doAnswer(invocationOnMock -> {
ListenableFutureCallback listenableFutureCallback = invocationOnMock.getArgument(0);
listenableFutureCallback.onSuccess(sendResult);
assertEquals(sendResult.getRecordMetadata().offset(), offset);
assertEquals(sendResult.getRecordMetadata().partition(), partition);
return null;
}).when(responseFuture).addCallback(any(ListenableFutureCallback.class));

service.publishDataToKafka(key, topic, siebelRecord);

verify(kafkaTemplate, times(1)).send(topic, key, siebelRecord);
}

@Test(expected = KafkaException.class)
public void can_capture_failure_publishDataToKafka() {
String key = someAlphanumericString();
String topic = someAlphaString(10);
String message = someString(20);

SiebelRecord siebelRecord = mock(SiebelRecord.class);
ListenableFuture<SendResult<String, Object>> responseFuture = mock(ListenableFuture.class);
Throwable throwable = mock(Throwable.class);

given(throwable.getMessage()).willReturn(message);
when(kafkaTemplate.send(topic, key, siebelRecord)).thenReturn(responseFuture);
doAnswer(invocationOnMock -> {
ListenableFutureCallback listenableFutureCallback = invocationOnMock.getArgument(0);
listenableFutureCallback.onFailure(throwable);
return null;
}).when(responseFuture).addCallback(any(ListenableFutureCallback.class));

service.publishDataToKafka(key, topic, siebelRecord);
}

关于unit-testing - 如何编写单元测试用例来为 ListenableFuture 添加回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56248612/

25 4 0