如何使用 MockWebServer 验证 POST 正文的内容?

Posted

技术标签:

【中文标题】如何使用 MockWebServer 验证 POST 正文的内容?【英文标题】:How can I verify the content of a POST Body with MockWebServer? 【发布时间】:2016-11-25 23:01:18 【问题描述】:

我有几个使用 Squares OkHttps MockWebServer 的单元测试。测试运行良好,一切运行良好。到目前为止,我无法做的一件事是验证 POST 请求的内容。

我为什么要这样做? 我正在开发的 REST Api 有一些方法,需要在 POST 请求正文中发送数据对象,其他方法需要将对象作为 FormUrlEncoded 数据字段发送。所以我想确保Retrofit 接口设置正确。符合规范。

以下单元测试将通过,但第一个单元测试在正文中发送数据不正确:

//Incorrect
@POST("api/v1/user/senddata")
Observable<Void> senddata (
        @Path("VIN") String vin,
        @Body PoiWrapper wrappedPoi);

//Correct
@FormUrlEncoded
@POST("api/v1/user/senddata")
Observable<Void> senddata(
        @Path("VIN") String vin,
        @Field("data") PoiWrapper wrappedPoi);

我知道MockWebServertakeRequest() 方法,但我一直无法从该请求正文中获取实际字段和数据。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

尝试关注these examples:

RecordedRequest recordedRequest = server.takeRequest();
assertEquals("POST", recordedRequest.getMethod());
assertEquals("def", recordedRequest.getBody().readUtf8());
assertEquals("3", recordedRequest.getHeader("Content-Length"));
assertEquals("text/plain; charset=utf-8", recordedRequest.getHeader("Content-Type"));

【讨论】:

好吧,这不是我问题的 100% 解决方案,但它把我推向了正确的方向。 readUtf8() 返回带有 html 编码表单字段的正文。我仍然需要对字符串进行解码,将其反序列化为Map,然后检查键和值。

以上是关于如何使用 MockWebServer 验证 POST 正文的内容?的主要内容,如果未能解决你的问题,请参考以下文章

延迟 MockWebServer 响应

使用 MockWebServer 时超时?

使用 Retrofit 和 MockWebServer 模拟无网络

MockWebServer 响应延迟 - 测试超时

使用 MockWebServer 模拟嵌套的改造 api 调用

使用 MockWebServer 模拟嵌套的改造 api 调用