Mockito mock JAX-RS Response调用readEntity报错解决方法
问题场景
- 需要Mock返回
javax.ws.rs.core.Response类型的对象,业务逻辑获取Response实例后会调用.readEntity(String.class)方法读取实体内容 - 初始测试代码中构造Mock返回值的写法如下:
when(methodCall).thenReturn(Response.status(Response.Status.OK).entity(someEntity).build());
- 执行到
response.readEntity(String.class)逻辑时抛出异常:
java.lang.IllegalStateException : Method not supported on an outbound message.
- 约束条件:无法修改主业务类代码,仅可调整测试类代码;当前使用技术栈为Java 1.8、JUnit 4.12、mockito-all 1.9.5、mockito-inline 3.8.0
- 待Mock的业务代码逻辑如下:
Response response = client.target().request().header().post(); String entity = response.readEntity(String.class);
问题原因
核心原因:通过Response.status(...).entity(...).build()构造出的是服务端出站(outbound)响应对象。JAX-RS规范中,出站响应是服务端用来向客户端返回结果的载体,本身不支持readEntity()方法——该方法仅对客户端侧接收到的入站(inbound)响应对象生效,直接在出站响应对象上调用该方法就会抛出上述异常。
解决方案
直接通过Mockito构造Response的Mock实例,不需要依赖JAX-RS自带的ResponseBuilder生成对象,该方案无额外依赖,完全适配当前技术栈:
// 定义需要模拟的响应实体内容 String mockReturnEntity = "你的模拟响应实体字符串"; // 创建Response的Mock对象 Response mockResponse = mock(Response.class); // 配置状态码返回,适配业务中可能存在的状态码校验逻辑 when(mockResponse.getStatus()).thenReturn(Response.Status.OK.getStatusCode()); // 配置readEntity方法的返回值 when(mockResponse.readEntity(String.class)).thenReturn(mockReturnEntity); // 将Mock好的响应对象设置为方法调用的返回值 when(methodCall).thenReturn(mockResponse);
如果业务逻辑中还调用了Response的其他方法(比如getHeaderString()、getStatusInfo()等),按照相同方式给Mock对象添加对应桩规则即可。
内容的提问来源于stack exchange,提问作者JIRAIYA
相关产品推荐
相关产品推荐

