簡體   English   中英

然后MockitoAnswer似乎沒有按預期工作

[英]Mockito thenAnswer doesn't seem to work as expected

我正在為使用AsyncHttpClient的以下代碼編寫單元測試。 在FutureCallback的實現中使用CountDownLatch和遞減CountDownLatch導致我的JUnit測試用例掛起,等待遞減倒數鎖存器。 在JUnit測試中,我使用ArgumentCaptor捕獲FutureCallback,然后使用thenAnswer調用完成的方法以遞減倒計時鎖存器。 但這似乎不起作用,任何想法都會有所幫助。

public List<QueryResponse> execute(Query query) {
    List<QueryResponse> res = new ArrayList<QueryResponse>();

    try {
        List<HttpRequestBase> requests = query.generateHttpRequests();
        List<Future<HttpResponse>> futures = new ArrayList<Future<HttpResponse>>();

        final CountDownLatch requestCompletionCDLatch = new CountDownLatch(requests.size());
        for (HttpRequestBase request : requests) {
            futures.add(httpClient.execute(request, new FutureCallback<HttpResponse>() {

                @Override
                public void failed(Exception e) {
                    logger.error("Error while executing: " + request.toString(), e);
                    requestCompletionCDLatch.countDown();
                }

                @Override
                public void completed(HttpResponse result) {
                    requestCompletionCDLatch.countDown();
                }

                @Override
                public void cancelled() {
                    logger.info("Request cancelled while executing: " + request.toString());
                    requestCompletionCDLatch.countDown();
                }
            }));
        }

        requestCompletionCDLatch.await();
        for (Future<HttpResponse> future : futures) {
            HttpResponse response = future.get(rcaRequestTimeout, TimeUnit.SECONDS);
            int status = response.getStatusLine().getStatusCode();
            if (status != HttpStatus.SC_OK) {
                logger.warn("Query with non-success status " + status);
            } else {
                res.add(query.parseResponse(response.getEntity().getContent()));
            }
        }
    } catch (IOException | InterruptedException | ExecutionException | TimeoutException e) {
        logger.error("Error while querying", e);
    } catch (URISyntaxException e) {
        logger.error("Error while generating the query", e);
    }
    return res;
}

我的單元測試如下:

@Test
public void testHttpError() throws InterruptedException, ExecutionException, TimeoutException {
    StatusLine status = Mockito.mock(StatusLine.class);
    when(status.getStatusCode()).thenReturn(400);

    HttpResponse response = Mockito.mock(HttpResponse.class);
    when(response.getStatusLine()).thenReturn(status);

    Future<HttpResponse> future = Mockito.mock(Future.class);
    when(future.get(anyLong(), any())).thenReturn(response);

    CloseableHttpAsyncClient httpClient = Mockito.mock(CloseableHttpAsyncClient.class);
    ArgumentCaptor<HttpUriRequest> requestCaptor = ArgumentCaptor.forClass(HttpUriRequest.class);
    ArgumentCaptor<FutureCallback<HttpResponse>> futureCallbackCaptor = ArgumentCaptor.forClass((Class)FutureCallback.class);
    when(httpClient.execute(any(), any())).thenReturn(future).thenAnswer(new Answer() {

        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            verify(httpClient).execute(requestCaptor.capture(), futureCallbackCaptor.capture());
            futureCallbackCaptor.getValue().completed(response);
            return null;
        }
    });

    StubbedRcaClient rcaClient = new StubbedRcaClient(httpClient);
    Query query = new Query("abc", "xyz", RcaHttpRequestType.GET, 1000);
    List<QueryResponse> res = rcaClient.execute(query);
    assertEquals(0, res.size());
    IOUtils.closeQuietly(rcaClient);
}

我通過如下更新JUnit來完成這項工作:

when(httpClient.execute(any(), any())).thenAnswer(new Answer<Future<HttpResponse>>() {

    @Override
    public Future<HttpResponse> answer(InvocationOnMock invocation) throws Throwable {
        verify(httpClient).execute(requestCaptor.capture(), futureCallbackCaptor.capture());
        futureCallbackCaptor.getValue().completed(response);
        return future;
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM