[英]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.