【问题标题】:Writing Mock test class for java http clientbuilder为 java http clientbuilder 编写 Mock 测试类
【发布时间】:2016-11-16 03:41:30
【问题描述】:

我是用 Java 编写单元测试用例的新手,我正试图弄清楚我应该如何为我的 http 客户端模拟我的测试用例。我正在尝试测试以下功能:

public HttpResponse getRequest(String uri) throws Exception {
        String url = baseUrl + uri;

        CloseableHttpClient httpClient =  HttpClientBuilder.create().build();
        HttpGet get = new HttpGet(url);
        get.setHeader(AUTHORIZATION_HEADER, authorization);
        get.setHeader(ACCEPT_HEADER, APPLICATION_JSON);
        HttpResponse response = httpClient.execute(get);
        return response;
    }

我不想实际调用 url 并访问服务器,我只想尝试模拟我可以从服务器获得的所有响应,例如 500 或 200 或套接字错误。我研究了 Mockito 库来模拟 java 函数,但我读过 Mockito 不能用于静态方法。

有人可以指导我如何为此编写单元测试吗?另外,由于在函数内部创建了 httpClient,这是测试的好习惯吗?

【问题讨论】:

标签: java unit-testing mockito powermockito


【解决方案1】:

在这种情况下,您不能模拟 HttpClient,因为您是在不推荐的方法中创建它,相反,您应该在这种情况下注入您的依赖项 HttClient。

下面是代码:

public class Test1 {
    private HttpClient httpClient ;
    Test1(HttpClient httpClient){
        this.httpClient = httpClient;
    }

    public HttpResponse getRequest(String uri) throws Exception {
        HttpGet get = new HttpGet(uri);
        HttpResponse response = httpClient.execute(get);
        return response;
    }
}

测试类

public class Test1Test {

    @Test
    public void testGetRequest() throws Exception {
        final HttpClient mockHttpClient = Mockito.mock(HttpClient.class);
        final Test1 test1 = new Test1(mockHttpClient);
        final HttpResponse mockHttpResponse = Mockito.mock(HttpResponse.class);
        final StatusLine mockStatusLine = Mockito.mock(StatusLine.class);
        Mockito.when(mockHttpClient.execute(ArgumentMatchers.any(HttpGet.class))).thenReturn(mockHttpResponse);
        Mockito.when(mockHttpResponse.getStatusLine()).thenReturn(mockStatusLine);
        Mockito.when(mockStatusLine.getStatusCode()).thenReturn(200);
        final HttpResponse response = test1.getRequest("https://url");
        assertEquals(response.getStatusLine().getStatusCode(), 200);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多