模拟HttpClient的execte()方法 [英] Mocking execte() method of HttpClient
问题描述
我想模拟 HttpClass
的 execute
方法以返回虚拟响应,但是我的测试代码正在执行
I want to mock execute
method of HttpClass
to return a dummy response, but my test code is acutally executing the request.
类代码-
class MyService {
private CloseableHttpClient newHttpClient() {
try {
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
new SSLContextBuilder().loadTrustMaterial(TrustAllStrategy.INSTANCE).build(),
NoopHostnameVerifier.INSTANCE);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException exception) {
logger.error(exception);
}
return null;
}
public String create(CreateRequestDTO Request) {
CloseableHttpClient client = newHttpClient();
CloseableHttpResponse response = null;
HttpPut httpPut = new HttpPut("MyUrl...");
try {
response = client.execute(httpPut);
} catch (IOException exception) {
return "exception";
}
return response.toString();
}
}
测试类代码-
@PrepareForTest({ MyService.class })
@PowerMockIgnore({ "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*",
"javax.activation.*", "javax.management.*", "javax.net.ssl.*", "javax.crypto.*" })
@RunWith(PowerMockRunner.class)
public class MyServiceTest {
@InjectMocks
private MyService MyService;
@Mock
private CloseableHttpClient closeableHttpClient;
@Mock
private HttpClient httpClient;
@Mock
private CloseableHttpResponse closeableHttpResponse;
@Mock
private HttpPut httpPut;
@Mock
private HttpEntity httpEntity;
@Before
public void setupTest() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testCreate() throws Exception {
// MyService MyServiceSpy = PowerMockito.spy(MyService);
MyService MyServiceSpy = PowerMockito.spy(MyService);
CreateRequestDTO createRequestDTO = new CreateRequestDTO();
createRequestDTO.setLocation("room 1");
createRequestDTO.setStartTime("3 pm");
createRequestDTO.setEndTime("4 pm");
try {
PowerMockito.doReturn(closeableHttpClient).when(MyServiceSpy, "newHttpClient");
// PowerMockito.when(MyServiceSpy,
// "newHttpClient").thenReturn(httpClient);
// PowerMockito.verifyPrivate(MyServiceSpy).invoke("newHttpClient");
String jsonEntity = " created successfully";
HttpEntity httpEntity = EntityBuilder.create().setText(jsonEntity)
.setContentType(org.apache.http.entity.ContentType.APPLICATION_JSON).build();
closeableHttpResponse.setEntity(httpEntity);
PowerMockito.doReturn(closeableHttpResponse).when(closeableHttpClient).execute(any(HttpPut.class));
// PowerMockito.doReturn(closeableHttpResponse).when(httpClient).execute(any(HttpPut.class));
String res = MyService.create(createRequestDTO);
logger.info("Result from create : " + res);
Assert.assertTrue(res.substring(0, 5).matches("BEGIN"));
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
}
我有
推荐答案
您的问题不是模拟客户端,而是模拟了客户端,而是尝试了Mockito而不是PowerMockito,但是请求仍然是真实执行的。与建立它。
当前,当您使用 HttpClients.custom()
静态方法时,您的代码将构建新的客户端,而不是模拟客户端。
Your problem is not with mocking the client, but with building it.
Currently your code builds a new client instead of the mock, when you use HttpClients.custom()
static method.
由于需要模拟静态方法,因此需要 PowerMockito.mockStatic()
Since you need to mock a static method, you'll need PowerMockito.mockStatic()
首先,您需要将 HttpClients
添加到您的 @PrepareForTest
批注中,然后您应该执行以下操作:
First you need to add HttpClients
to your @PrepareForTest
annotation, and later you should do:
PowerMockito.mockStatic(HttpClients.class);
when(HttpClients.custom()).thenReturn(mockedBuilder);
when(mockedBuilder.setSSLSocketFactory(any(SSLSocketFactory.class)).theReturn(mockedBuilder);
when(mockedBuilder.build()).thenReturn(httpClient);// your mock object
这篇关于模拟HttpClient的execte()方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!