使用Robolectric,如何测试沿POST *请求发送的JSON值*

时间:2013-01-31 08:15:02

标签: java android testing apache-commons-httpclient robolectric

在我的应用程序中,我将在POST请求中向服务器发送JSON。

我想测试以确保我发送正确的值。

由于我正在使用Robolectric,我的结论是我应该将请求发送到FakeHttpLayer,取出JSON,并测试它是否符合我的预期。

听起来很简单,但我有一段时间想弄清楚如何查看我发布的JSON。

我的代码模糊地看起来像这样:

HttpClient client = new DefaultHttpClient();
HttpResponse response;
JSONObject json = new JSONObject();
try{
    HttpPost post = new HttpPost("http://google.com");
    json.put("blah", "blah");
    StringEntity se = new StringEntity( "JSON: " + json.toString());
    se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
    post.setEntity(se);
    response = client.execute(post);
} catch(Exception e){
  e.printStackTrace();
}

我希望有类似

的东西
assertTrue(myRequestJSON.matches("blah"));

但我似乎无法使用

中的任何内容
Robolectric.getFakeHttpLayer().getLastSentHttpRequestInfo();

......或其他任何变体。

帮助?

顺便说一句,如果您认为我的测试方法被误导,我肯定会以不同的方式思考这个问题。

谢谢!

编辑:我意识到我的虚拟代码中有“myResponseJSON”,而不是“myRequestJSON”,这可能使其不清楚 - 已修复。

1 个答案:

答案 0 :(得分:2)

我以前的解决方案完全错了。你可以做到这一点而不仅仅是它会出现。我在Robolectric示例代码中找到了解决方案(可预测):

HttpPost sentHttpRequest = (HttpPost) Robolectric.getSentHttpRequest(0);
StringEntity entity = (StringEntity) sentHttpRequest.getEntity();
String sentPostBody = fromStream(entity.getContent());
assertThat(sentPostBody, equalTo("a post body"));
assertThat(entity.getContentType().getValue(), equalTo("text/plain; charset=UTF-8"));

(来自here