java - Java 的 ListenableFuture 和 addListener 回调的单元测试
问题描述
我有一个模块,该模块具有将数据写入 Kinesis 流的方法。我们称之为反馈流。
我想对在 ListenableFuture 的结果上调用的分析服务函数运行验证单元测试,我尝试设置模拟,但遇到 ClassCast 异常。我想我可能错误地设置了模拟。
我想单元测试的方法:
public void writeData(KinesisRecord kinesisRecord, Response response) {
FeedbackRecord feedbackRecord = new
FeedbackRecord(kinesisRecord.getVersion(), kinesisRecord.getNotificationId(), response.name(),
kinesisRecord.getDestination());
Gson g = new Gson();
byte[] dataBytes = g.toJson(feedbackRecord).getBytes(StandardCharsets.UTF_8);
ListenableFuture<UserRecordResult> future = kinesisProducer.addUserRecord(streamName, kinesisRecord.getNotificationId(), ByteBuffer.wrap(dataBytes));
future.addListener(() -> {
try {
UserRecordResult userRecordResult = future.get();
analyticsService.trackSuccess(AnalyticsConstants.FeedbackProducer.WRITE_SUCCESS, AnalyticsConstants.FeedbackProducer.WRITEDATA_LOCATION + " " + userRecordResult.getSequenceNumber());
log.debug("Write to Kinesis Feedback successful, record sequence number: " + userRecordResult.getSequenceNumber());
} catch (InterruptedException e) {
e.printStackTrace();
analyticsService.trackError(AnalyticsConstants.FeedbackProducer.WRITE_ERROR, AnalyticsConstants.FeedbackProducer.WRITEDATA_LOCATION);
log.error("Feedback Kinesis Write failed: " + e);
} catch (ExecutionException e) {
e.printStackTrace();
analyticsService.trackError(AnalyticsConstants.FeedbackProducer.WRITE_ERROR, AnalyticsConstants.FeedbackProducer.WRITEDATA_LOCATION);
log.error("Feedback Kinesis Write failed: " + e);
}
}, MoreExecutors.directExecutor());
单元测试尝试:
@Test
public void addUserRecordFutureTest() throws ExecutionException, InterruptedException {
ListenableFuture<UserRecordResult> responseFuture = mock(ListenableFuture.class);
Attempt attempt = new Attempt(1, 2, "AttemptError", "5xx", true);
List<Attempt> attempts = new ArrayList<>();
attempts.add(attempt);
UserRecordResult mockUserRecordResult = mock(UserRecordResult.class);
when(kinesisProducer.addUserRecord(any(), any(), any())).thenReturn(responseFuture);
doAnswer(invocation -> {
ListenableFutureCallback listenableFutureCallback = invocation.getArgument(0);
listenableFutureCallback.onSuccess(mockUserRecordResult);
// do asserts here
return null;
}).when(responseFuture).addListener(any(), any());
feedbackProducer.writeData(mockRecord, FeedbackProducer.Response.invalid_channel);
}
堆栈跟踪:
解决方案
推荐阅读
- node.js - 如何在Node js excel-export中设置列宽
- python-3.x - 在浏览器选项卡之间切换 - Appium
- ionic3 - 页面不使用动画 ionic3 过渡
- jenkins - 在 dockerized Jenkins 的 docker 容器步骤中访问作业的工作区
- java - newFixedThreadPool 不时执行
- ios - 如何使用 Swift 在矩阵中添加对角线?
- java - Android - 如何动态移动到活动或以前的活动?
- kotlin - Kotlin JSR223 引擎传递绑定
- javascript - 使用枚举创建时间转换器的最佳方法
- promise - Feathers 自定义服务响应在控制台中有效,但在 API 响应中获取空数组