Question

In my app I'm going to be sending JSON in a POST request to the server.

I want to test to make sure I'm sending the right values.

Since I'm using Robolectric, my conclusion is that I should get the request that is being sent to the FakeHttpLayer, pull out the JSON, and test that it matches my expectations.

Sounds simple, but I'm having a hell of a time figuring out how to see what JSON I've POSTed.

My code vaguely looks like this:

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();
}

I want to have something which is like

assertTrue(myRequestJSON.matches("blah"));

But I can't seem to get that using anything inside of

Robolectric.getFakeHttpLayer().getLastSentHttpRequestInfo();

...or any of the other variations on that.

Help?

By the way, I'm certainly open to thinking about this in a different way, if you think my testing approach is misguided.

Thank you!

EDIT: I realized I had "myResponseJSON" in my dummy code rather than "myRequestJSON," which may have made it unclear--fixed.

Was it helpful?

Solution

I was completely wrong in my previous solution. You can do this rather simply it would appear. I found the solution (predictably) in the Robolectric example code:

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"));

(from here)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top