[英]Write junit test cases for the Future callback
有人可以幫忙為下面的代碼部分(尤其是add回調部分)編寫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"));
}
}
});
}
您可以通過以下方式對ListeneableFuture
和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));
}
另外,您可以使用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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.