Java'上的单元测试;s ListenableFuture和addListener回调

Java'上的单元测试;s ListenableFuture和addListener回调,java,unit-testing,java-8,mockito,future,Java,Unit Testing,Java 8,Mockito,Future,我有一个模块,它有一个方法,可以将数据写入一个运动流。我们称之为反馈流 我想对我的分析服务的函数运行一个验证单元测试,这些函数在ListenableFuture的结果中被调用,我已经尝试过设置mock,但是得到一个ClassCast异常。我想我可能设置的模拟不正确 我要进行单元测试的方法: public void writeData(KinesisRecord kinesisRecord, Response response) { FeedbackRecord feedbackReco

我有一个模块,它有一个方法,可以将数据写入一个运动流。我们称之为反馈流

我想对我的分析服务的函数运行一个验证单元测试,这些函数在ListenableFuture的结果中被调用,我已经尝试过设置mock,但是得到一个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());
public void writeData(视频录制视频录制,响应){
反馈记录反馈记录=新
反馈记录(kinesRecord.getVersion()、kinesRecord.getNotificationId()、response.name(),
kinesisRecord.getDestination());
Gson g=新的Gson();
byte[]dataBytes=g.toJson(feedbackRecord).getBytes(StandardCharsets.UTF_8);
ListenableFuture=kinesisProducer.addUserRecord(streamName,kinesRecord.getNotificationId(),ByteBuffer.wrap(dataBytes));
future.addListener(()->{
试一试{
UserRecordResult UserRecordResult=future.get();
analyticsService.trackSuccess(AnalyticsConstants.FeedbackProducer.WRITE_成功,AnalyticsConstants.FeedbackProducer.WRITEDATA_位置+“”+userRecordResult.getSequenceNumber());
调试(“成功写入Kinesis反馈,记录序列号:”+userRecordResult.getSequenceNumber());
}捕捉(中断异常e){
e、 printStackTrace();
analyticsService.trackError(AnalyticsConstants.FeedbackProducer.WRITE_错误,AnalyticsConstants.FeedbackProducer.WRITEDATA_位置);
日志错误(“反馈信息写入失败:+e”);
}捕获(执行例外){
e、 printStackTrace();
analyticsService.trackError(AnalyticsConstants.FeedbackProducer.WRITE_错误,AnalyticsConstants.FeedbackProducer.WRITEDATA_位置);
日志错误(“反馈信息写入失败:+e”);
}
},more executors.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);
}
@测试
public void addUserRecordFutureTest()引发ExecutionException、InterruptedException{
ListenableFuture responseFuture=mock(ListenableFuture.class);
尝试=新尝试(1,2,“尝试错误”,“5xx”,真);

列表

请添加stacktrace。我在这里没有看到显式转换(?)。@其次,我也没有…但我只是添加了跟踪项。问题与调用有关。getArgument(0)
。可能将该部分转换为非lambda表达式会有所帮助。请尝试找出
addListener
的第一个参数来自何处。