java - 使用 Mockito 模拟 Apache HTTPClient

标签 java mocking mockito apache-httpclient-4.x

我正在尝试模拟 Apache HttpClient 接口(interface),以便模拟下面提到的其中一种方法,以返回一个 stub JSON 对象作为响应。

HttpResponse response = defaultHttpClient.execute(postRequest); 

有人可以建议如何通过一些示例代码来实现这一点吗?您的帮助将不胜感激。

谢谢

最佳答案

这是我使用 Mockito 和 Apache HttpBuilder 测试我的代码时所做的:

待测类:

import java.io.BufferedReader;
import java.io.IOException;

import javax.ws.rs.core.Response.Status;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class StatusApiClient {
private static final Logger LOG = LoggerFactory.getLogger(StatusApiClient.class);

    private String targetUrl = "";
    private HttpClient client = null;
    HttpGet httpGet = null;

    public StatusApiClient(HttpClient client, HttpGet httpGet) {
        this.client = client;
        this.httpGet = httpGet;
    }

    public StatusApiClient(String targetUrl) {
        this.targetUrl = targetUrl;
        this.client = HttpClientBuilder.create().build();
        this.httpGet = new HttpGet(targetUrl);
    }

    public boolean getStatus() {
        BufferedReader rd = null;
        boolean status = false;
        try{
            LOG.debug("Requesting status: " + targetUrl);


            HttpResponse response = client.execute(httpGet);

            if(response.getStatusLine().getStatusCode() == Status.OK.getStatusCode()) {
                LOG.debug("Is online.");
                status = true;
            }

        } catch(Exception e) {
            LOG.error("Error getting the status", e);
        } finally {
            if (rd != null) {
                try{
                    rd.close();
                } catch (IOException ioe) {
                    LOG.error("Error while closing the Buffered Reader used for reading the status", ioe);
                }
            }   
        }

        return status;
    }
}

测试:

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpHostConnectException;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class StatusApiClientTest extends Mockito {

    @Test
    public void should_return_true_if_the_status_api_works_properly() throws ClientProtocolException, IOException {
        //given:
        HttpClient httpClient = mock(HttpClient.class);
        HttpGet httpGet = mock(HttpGet.class);
        HttpResponse httpResponse = mock(HttpResponse.class);
        StatusLine statusLine = mock(StatusLine.class);

        //and:
        when(statusLine.getStatusCode()).thenReturn(200);
        when(httpResponse.getStatusLine()).thenReturn(statusLine);
        when(httpClient.execute(httpGet)).thenReturn(httpResponse);

        //and:
        StatusApiClient client = new StatusApiClient(httpClient, httpGet);

        //when:
        boolean status = client.getStatus();

        //then:
        Assert.assertTrue(status);
    }

    @Test
    public void should_return_false_if_status_api_do_not_respond() throws ClientProtocolException, IOException {
        //given:
        HttpClient httpClient = mock(HttpClient.class);
        HttpGet httpGet = mock(HttpGet.class);
        HttpResponse httpResponse = mock(HttpResponse.class);
        StatusLine statusLine = mock(StatusLine.class);

        //and:
        when(httpClient.execute(httpGet)).thenThrow(HttpHostConnectException.class);

        //and:
        StatusApiClient client = new StatusApiClient(httpClient, httpGet);

        //when:
        boolean status = client.getStatus();

        //then:
        Assert.assertFalse(status);
    }

}

你们觉得伙计们,我需要改进什么吗? (是的,我知道,评论。那是我从 Spock 背景带来的东西:D)

关于java - 使用 Mockito 模拟 Apache HTTPClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20542361/

相关文章:

java - 如何模拟objectOutputStream.writeObject()?

java - Google foobar 2019,测试在我的本地计算机(IDE)上通过,但在 foobar 上失败

java - 使用Kotlin编译Java代码时报错: generics are not supported in -source 1. 3

java - 为什么我的 ArrayList 包含添加到列表中的最后一项的 N 个副本?

php - 关于获取通用模拟对象的简单 PHPUnit 之一

java - 如何让 Powermock 与 Dexmaker 一起工作

java - 如何在 Facebook 广告标题中显示 & 符号

java - 模拟 CGLIB 增强对象

c# - 需要模拟自定义类以进行单元测试

java - Liferay Junit-Mockito 测试