Java中HTTPGet的模拟响应



>我必须模拟对返回带有 JSON 实体的响应的 API 的请求为此,我模拟了 get 请求以及 JSON 对象

public class RestTest {
    static JSONObject job;
    static JSONArray portsArray;
    static JSONArray routesArray;
    static JSONObject routeObject;
    private static final HttpClient  client = mock(DefaultHttpClient.class);
    private static final HttpGet  get = mock(HttpGet.class);
    private static final HttpResponse response = mock(CloseableHttpResponse.class);
    private static  HttpEntity entity = mock(HttpEntity.class);
    @BeforeClass
    public static void setup() throws ClientProtocolException, IOException, JSONException {
        HttpGet getRoute = new HttpGet("api/to/access");
        getRoute.setHeader("Content-type", "application/json");
        JSONObject routesJson = new JSONObject();
        routesJson.put("","");
        when(response.getEntity()).thenReturn(entity);
        when(response.getEntity().getContent().toString()).thenReturn(routesJson.toString());
        when(client.execute(getRoutes)).thenReturn(response);
    }
}

这将在 when(response.getEntity().getContent().toString()).thenReturn(routesJson.toString()); 处返回一个空指针

如何正确模拟 JSON 对象,以便在执行实际请求时返回模拟的 JSON?

由于该方法不存在,因此我无法设置示例中所示的entity.setContent()

好吧,让我们看看这两行。

    when(response.getEntity()).thenReturn(entity);
    when(response.getEntity().getContent().toString()).thenReturn(routesJson.toString());

您认为哪个优先?我不知道,我也不会指望它被很好地定义,无论任何文档怎么说。

可能正在发生的事情:

你说

   when(response.getEntity()).thenReturn(entity);

发生这种情况时:

   response.getEntity().getContent().toString()

您可能正在拨打电话

entity.getContent().toString()

这肯定会导致 NPE,因为您还没有为entity.getContent()定义任何内容

如果您必须以这种方式进行测试,我建议您使用 RETURNS_DEEP_STUBS。所以

 private static final HttpResponse response = mock(CloseableHttpResponse.class, 
Mockito.RETURNS_DEEP_STUBS);

然后,您可以完全跳过手动模拟HttpEntity,只需执行

when(response.getEntity().getContent().toString()).thenReturn(routesJson.toString());

相关内容

  • 没有找到相关文章

最新更新