Java 为将来的回调编写junit测试用例

Java 为将来的回调编写junit测试用例,java,junit,callback,async-await,completable-future,Java,Junit,Callback,Async Await,Completable Future,有人能帮我为下面的代码部分编写JUnit测试,特别是添加回调部分吗? 我不知道如何使用回调为Listenablefuture编写单元测试用例 private void handleResponse(final ListenableFuture<UserRecordResult> response, CompletableFuture future) { Futures.addCallback(response, new FutureCallback<U

有人能帮我为下面的代码部分编写JUnit测试,特别是添加回调部分吗?
我不知道如何使用回调为Listenablefuture编写单元测试用例

    private void handleResponse(final ListenableFuture<UserRecordResult> response, CompletableFuture future) {

        Futures.addCallback(response, new FutureCallback<UserRecordResult>() {

            @Override
            public void onFailure(@Nonnull Throwable throwable) {

                future.completeExceptionally(new Exception("Fail to put record" + throwable.getMessage()));
            }

            @Override
            public void onSuccess(UserRecordResult result) {
                if(result.isSuccessful()) {
                    future.complete(true);
                } else {
                    future.completeExceptionally(new Exception("Fail to put record"));
                }
            }
        });
    }
private void handleResponse(最终可列出的未来响应,可完成的未来){
Futures.addCallback(response,newfuturecallback(){
@凌驾
public void onFailure(@Nonnull Throwable Throwable){
future.completeeexceptionaly(新异常(“未能放入记录”+throwable.getMessage());
}
@凌驾
成功时公共无效(UserRecordResult){
if(result.issusccessful()){
未来。完成(真实);
}否则{
未来。异常完全(新异常(“未放入记录”);
}
}
});
}

您可以通过以下方式存根
listenablefuture
CompletableFuture
进行测试:

@Test
public void completeExceptionallyOnCallbackFailure() {
    ListenableFuture<UserRecordResult> failureResponse = Futures.immediateFailedFuture(new RuntimeException());
    CompletableFuture future = new CompletableFuture();

    handleResponse(failureResponse, future);

    assertThat(future.isCompletedExceptionally(), equalTo(true));
}

@Test
public void completeExceptionallyIfUserRecordResultIsNotSuccessful() {
    UserRecordResult mockResult = Mockito.mock(UserRecordResult.class);
    Mockito.when(mockResult.isSuccessful()).thenReturn(false);

    ListenableFuture<UserRecordResult> failureResponse = Futures.immediateFuture(mockResult);
    CompletableFuture future = new CompletableFuture();

    handleResponse(failureResponse, future);

    assertThat(future.isCompletedExceptionally(), equalTo(true));
}

@Test
public void completeSuccessfully() throws ExecutionException, InterruptedException {
    UserRecordResult mockResult = Mockito.mock(UserRecordResult.class);
    Mockito.when(mockResult.isSuccessful()).thenReturn(true);

    ListenableFuture<UserRecordResult> successResponse = Futures.immediateFuture(mockResult);
    CompletableFuture future = new CompletableFuture();

    handleResponse(successResponse, future);

    assertThat(future.get(), equalTo(true));
}

只是一个想法。。动画师不是你的。因此,它应该被嘲笑,你将处理响应部分,要么是成功的,要么是失败的!我不知道如何为void方法handleResponse编写单元测试函数的设置方式对测试没有太大帮助。您可以更改它,这样就可以将它转换为实际的类并为此编写测试,而不是使用匿名类。所以你有关于失败和成功的报道。至于HandlerResponse本身,它使用的是
Futures.addCallback
,这不是您测试的代码/责任!现在,如果您真的想看到这一行也是绿色的,那么您必须使用类似PowerMock的东西“mock”Futures.addCallback。如果我在不同的线程上运行Futures.addCallback,我如何处理这个问题。
@Test
public void verifyMessageIfCompletedExceptionallyAfterUserRecordResultIsNotSuccessful() {
    UserRecordResult mockResult = Mockito.mock(UserRecordResult.class);
    Mockito.when(mockResult.isSuccessful()).thenReturn(false);

    ListenableFuture<UserRecordResult> failureResponse = Futures.immediateFuture(mockResult);
    CompletableFuture future = new CompletableFuture();

    Assertions.assertThatThrownBy(() -> {
        handleResponse(failureResponse, future);
        future.get();
    })
    .isInstanceOf(Exception.class)
    .hasMessage("java.lang.Exception: Fail to put record");
}