- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试为 http post 实现编写单元测试。但是我无法正确模拟 httpclient 并且我的 when 语句永远不会被触发。我编写的单元测试是进行实际的 http 调用,而不是使用模拟响应进行响应。我们如何继续模拟由 HttpClientBuilder 创建的客户端?
HTTP 方法实现:
HttpResponse postRequest(String url, String request) {
HttpResponse resp = null;
try {
HttpClient client = HttpClientBuilder.create().useSystemProperties().build();
HttpPost post = new HttpPost(url);
post.addHeader("Content-Type", "application/x-www-form-urlencoded");
post.setEntity(new StringEntity(request));
resp = client.execute(post);
} catch (Exception e) {
return null;
}
}
测试方法:
@Mock
private HttpClient httpClient;
when(httpClient.execute(any())).thenReturn(httpResponse);
最佳答案
How do we proceed with mocking a client created by HttpClientBuilder?
我们不!!!
尽量避免 mock 第三方问题
创建紧耦合静态实现关注点的抽象
public interface HttpClientFactory {
public HttpClient create();
}
通过将在生产中使用的简单实现。
public class HttpClientFactoryImpl implements HttpClientFactory {
//...
public HttpClient create() {
return HttpClientBuilder.create().useSystemProperties().build();
}
//...
}
使用依赖倒置,封装类应该显式依赖抽象以避免违反单一职责原则(SRP)
public class SystemUnderTest {
private HttpClientFactory httpClientFactory;
public SystemUnderTest(HttpClientFactory httpClientFactory) {
this.httpClientFactory = httpClientFactory;
}
HttpResponse postRequest(String url, String request) {
HttpResponse resp = null;
try {
HttpClient client = httpClientFactory.create();
HttpPost post = new HttpPost(url);
post.addHeader("Content-Type", "application/x-www-form-urlencoded");
post.setEntity(new StringEntity(request));
resp = client.execute(post);
return resp;
} catch (Exception e) {
return null;
}
}
}
这种关注点分离 (SoC) 允许它(您的封装类) 更灵活地进行隔离单元测试。
@Test
public void testPostRequest() throws Exception {
// Arrange
HttpResponse expected = mock(HttpResponse.class);
HttpClient httpClient = mock(HttpClient.class);
when(httpClient.execute(any())).thenReturn(expected);
HttpClientFactory httpClientFactory = mock(HttpClientFactory.class);
when(httpClientFactory.create()).thenReturn(httpClient);
SystemUnderTest systemUnderTest = new SystemUnderTest(httpClientFactory);
String url = "http://url_here";
String request = "Hello World";
// Act
HttpResponse actual = systemUnderTest.postRequest(url, request);
// Assert
assertEquals(expected, actual);
//should also verify that the expected arguments as passed to execute()
}
关于java - 如何为单元测试模拟 HttpClientBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57983203/
我正在尝试为 http post 实现编写单元测试。但是我无法正确模拟 httpclient 并且我的 when 语句永远不会被触发。我编写的单元测试是进行实际的 http 调用,而不是使用模拟响应进
从 HttpClient 4.3 开始,我一直在使用 HttpClientBuilder。我正在连接到具有基本身份验证的 REST 服务。我按如下方式设置凭据: HttpClientBuilder b
尝试使用 HttpClientBuilder 构建 Apache HttpClient 实例时出现 IllegalArgumentException: private CloseableHttpCli
Apache 已弃用 DefaultHttpClient,但 Android 似乎并非如此,另请参见此处 Deprecated Java HttpClient - How hard can it be
我在 android studio 上遇到了一个奇怪的问题。我正在使用 apache 库来发出一些 http 请求,我需要更改 org.apache.http.impl.client.DefaultH
HttpClient httpClient = HttpClientBuilder.create().setSSLSocketFactory(socketFactory).build(); 无法解析
我试图用这行代码创建一个 httpClient 实例: HttpClient httpClient = HttpClientBuilder.create().build(); 编译没问题,但是当代码执
我有一个 httpClientBuilder 实例, 我想将 CoreProtocolPNames.PROTOCOL_VERSION 设置为 HttpVersion.HTTP_1_1。 我应该如何使用
老程序员,Java新手。我正在尝试运行我认为非常常见的示例代码,该代码在网络上的许多地方都很相似,HttpClient httpClient = HttpClientBuilder.create().
这是我创建 HttpClient 的方法: private String userAgent= "Non empty user agent"; private HttpClient httpClien
我有一个使用 HttpClient 执行 HTTP 请求的 Maven Java 项目。在我本地的 Java Web 服务器上,一切正常。但是在我将其部署到 SAP Hana Cloud Platfo
我正在尝试为使用 HttpClientBuilder 发出的请求设置代理,如下所示: CredentialsProvider credsProvider = new BasicCred
以下是创建Httpclient的代码。 client = HttpClients.custom().setConnectionManager(connManag
在下面的 java 代码中,我随机收到以下错误。 final HttpClient client = HttpClientBuilder.create().build(); fin
我有一个在 Vanilla Spring 4.2.5.RELEASE 和 JDK 1.7 上运行的项目,它使用 RestTemplate 和 PoolingHttpClientConnectionMa
我正在使用HttpClient并且我使用httpCore.jar但我仍然面临异常 java.lang.ClassNotFoundException: org.apache.http.config.Lo
当我调用此代码时: HttpClientBuilder clientBuilder = HttpClientBuilder.create(); LaxRedirectStrategy laxStrat
我尝试从 servlet 中的静态函数向远程服务器发送请求,我使用 org.apache.http.client.HttpClient; 但是当我调试时,它总是停留在创建 HttpClient 上。
我正在尝试创建 HTTPClient 以使用 Java 中的 Apache HTTPClient 为 REST web 服务构建框架。 在这里我发现我们可以使用以下两种方式创建客户端。我想知道它们之间
在这里,我尝试在 selenium webdriver 中执行断开的链接场景,而我的 Java IDE 在“HttpClientBuilder()”上抛出错误 这是我的代码: public stati
我是一名优秀的程序员,十分优秀!