繁体   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