模拟的HttpClient调用实际方法

编程入门 行业动态 更新时间:2024-10-23 07:28:27
本文介绍了模拟的HttpClient调用实际方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

在我的测试类中,我正在模拟HTTPclient,但是当我运行测试类时,它将调用实际方法而不是在行上进行模拟

In my test class I am mocking HTTPclient but when I run test class it calls actual method instead of mock at line

final HttpResponse response = httpClient.execute(postRequest);

并给了我java.lang.IllegalStateException.

and gives me java.lang.IllegalStateException.

这是我的代码

final HttpClient httpClient = new DefaultHttpClient(); final HttpPost postRequest = new HttpPost(someURL); final String inputJson = mapper.writeValueAsString(someObj); final StringEntity input = new StringEntity(inputJson); input.setContentType("application/json"); postRequest.setEntity(input); final HttpResponse response = httpClient.execute(postRequest); if (response.getStatusLine().getStatusCode() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatusLine().getStatusCode()); } final BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));

这是我的测试班级代码

public class XGenericServiceTest { @InjectMocks private XGenericService xGenericService = new XGenericService(); @Mock HttpClient httpClient; @Mock HttpResponse httpResponse; @Mock HttpEntity httpEntity; @Mock StatusLine statusLine; @Mock HttpPost httpPost; @Before public void init() { MockitoAnnotations.initMocks(this); } @Test public void testgetXClient(){ try { String s = "[{\"firstName\":\"adasd\"}]"; when(httpClient.execute(Mockito.isA(HttpPost.class))).thenReturn(httpResponse); when(httpResponse.getStatusLine()).thenReturn(statusLine); when(statusLine.getStatusCode()).thenReturn(HttpStatus.SC_OK); when(httpEntity.getContent()).thenReturn(new ByteArrayInputStream(s.getBytes())); when(httpResponse.getEntity()).thenReturn(httpEntity); List<MdmClient> results = xGenericService.getXClient("userId", "surname", "givenName", "postalCode", "availableId", "phoneNumber", "organizationName", "otherKey"); } catch (Exception e) { e.printStackTrace(); } }

}

但是我正在遵循异常

java.lang.IllegalStateException: Target host must not be null, or set in parameters. at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:784) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:414) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) at au.allianz.omnia.service.SafireGenericService.getSafireClient(SafireGenericService.java:87) at au.allianz.omnia.service.SafireGenericServiceTest.testgetSafireClient(SafireGenericServiceTest.java:61) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) at java.lang.reflect.Method.invoke(Method.java:613) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)

有人可以指出以上代码的问题吗?

Can anybody point me what is wrong with above code?

推荐答案

从共享的代码段中可以明显看出,HttpClient和HttpPost是通过new运算符实例化的,而不是使用注入的任何实例级别(即自动接线)对象.

From the code snippet shared it is evident that HttpClient and HttpPost are instantiated via new operator instead of using any instance level injected (i.e. autowired) objects.

final HttpClient httpClient = new DefaultHttpClient(); final HttpPost postRequest = new HttpPost(someURL);

因此@InjectMocks和@Mock本质上不起作用,并且从测试类中调用时,将使用HttpClient和HttpPost的 real 实例;解释遇到的错误.

Thus the @InjectMocks and @Mock essentially have no effect and the real instance of HttpClient and HttpPost are used when invoked from test class; which explains the error encountered.

在这种特定情况下,Mockito(也许是任何模拟框架)都无济于事.要继续进行,如果可能的话,请重构受测试的代码,例如使用实例级注入的对象,而不是使用通过new运算符创建的实例.

In this particular scenario Mockito (perhaps any mocking framework) can't help. To proceed, if possible, refactor the code under test such as to use the instance level injected object(s) instead of using the instance created via new operator.

更多推荐

模拟的HttpClient调用实际方法

本文发布于:2023-10-31 07:40:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1545460.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:方法   HttpClient

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!