Spring WebFlux使用StepVerifier测试Mono<List>时JSON反序列化错误排查
错误原因
- 测试中Mock服务返回的响应体是单个JSON对象:
{"separator":"value"},JSON结构以{开头属于Object类型 - 业务代码中声明了要将接口返回值反序列化为
List<MyResponse>,Jackson反序列化时检测到当前读取到的是JsonToken.START_OBJECT(对象起始标记),和预期的数组起始标记JsonToken.START_ARRAY不匹配,直接抛出类型不匹配的反序列化异常。
修复方案
根据实际的接口返回结构二选一即可:
方案1:接口确实返回单个MyResponse对象
修改业务方法的返回类型声明,把Mono<List<MyResponse>>改为Mono<MyResponse>,同步调整测试代码:
// 测试代码调整 MyResponse expectedResponse = MyResponse.builder().separator("value").build(); MyRequest request= StubGenerator.getRequest(); mockServer.enqueue(new MockResponse() .setBody("{\"separator\":\"value\"}") .addHeader("Content-Type", "application/json")); Mono<MyResponse> responseMono = MyService.getResponse(request, "token"); StepVerifier.create(responseMono) .expectNext(expectedResponse) .verifyComplete();
方案2:接口实际返回MyResponse数组
仅调整Mock响应的body结构,把单个对象包裹为数组即可,其余代码无需修改:
mockServer.enqueue(new MockResponse() // 把原来的单个对象改为数组结构 .setBody("[{\"separator\":\"value\"}]") .addHeader("Content-Type", "application/json"));
内容的提问来源于stack exchange,提问作者Snehasis Rout
相关产品推荐
相关产品推荐

