java - 为 Future 回调编写 junit 测试用例

标签 java junit callback async-await completable-future

有人可以帮助为下面的代码部分(尤其是添加回调部分)编写 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"));
                }
            }
        });
    }

最佳答案

您可以通过以下方式 stub ListeneableFutureCompletableFuture 进行测试:

@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));
}

此外,您还可以使用 assertj 断言实际的错误消息:

@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");
}

关于java - 为 Future 回调编写 junit 测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964632/

相关文章:

java - Android 使用单个光标获取多个内容提供程序

java - 如何确保 JUnit @Before 具有随附的 @After

java - 运行 junit easymock 测试时意外的方法调用

javascript - 如何在不使用异步的情况下控制回调并阻止它们返回?

Java 尝试在 2D 中进行光线转换

java - 断言 JMockit 期望结果与构造的实例相同

ruby-on-rails - 为什么 OmniAuth::Strategies::Facebook::NoAuthorizationCodeError 未在omniauth on_failure 回调中处理?

C++:如何将指针传递给另一个类的成员函数?

java - 帮助设计速度模板以支持页眉和页脚

java - 希望在使用故意错误的 JSON 有效负载时测试预期错误