如何测试JAX-RS的OutboundJaxrsResponse并获取状态码与响应原因?
解决方案
你不需要对OutboundJaxrsResponse做特殊转换,它本身就是JAX-RS标准Response接口的实现类,不要把返回值声明为OutboundJaxrsResponse具体类型,直接声明为标准Response接口类型即可避免受密封类的可见性限制,调用接口定义的标准API就能拿到你需要的所有字段。
核心API说明
你需要的三个能力都可以直接通过Response接口的原生方法获取:
- 状态码:调用
getStatus()方法,直接返回int类型的状态码 - 自定义原因短语:调用
getStatusInfo().getReasonPhrase()即可拿到你在Response.status()方法中传入的自定义短语 - 响应实体:调用
readEntity(Class<T> type)方法,按你需要的类型解析响应体,若需要多次读取可以先调用bufferEntity()缓存实体流
封装你需要的测试工具方法
按照你期望的测试语法,你可以封装一个简单的工具方法简化实体读取:
// Kotlin实现 fun entity(response: Response): String { response.bufferEntity() return response.readEntity(String::class.java) } // 如果需要解析成自定义类型可以加重载 fun <T> entity(response: Response, type: Class<T>): T { response.bufferEntity() return response.readEntity(type) }
完整测试示例
@SpringBootTest class MyControllerTest { // 注入你要测试的Controller Bean @Autowired private lateinit var controller: MyController @Test fun `测试正常场景返回正确结果`() { val response = controller.getStatus("validKey") // 按你期望的语法断言 assertEquals("你的响应实体内容", entity(response)) assertEquals(200, response.status) assertEquals("This okay", response.statusInfo.reasonPhrase) } @Test fun `测试异常场景返回404`() { // 构造抛出异常的场景,比如传入非法key或者mock依赖抛出异常 val response = controller.getStatus("invalidKey") assertEquals(404, response.status) assertEquals("Error, resource not found", response.statusInfo.reasonPhrase) } }
可选方案:转自定义测试DTO
如果你希望完全脱离JAX-RS的响应类型,也可以写一个扩展方法直接转换成自定义的测试DTO:
data class TestResponse( val status: Int, val reasonPhrase: String, val body: String ) fun Response.toTestResponse(): TestResponse { bufferEntity() return TestResponse( status = status, reasonPhrase = statusInfo.reasonPhrase, body = readEntity(String::class.java) ) } // 测试中使用 val testResp = controller.getStatus("validKey").toTestResponse() assertEquals(200, testResp.status) assertEquals("This okay", testResp.reasonPhrase)
集成测试替代方案
如果你需要走完整HTTP链路测试,也可以直接用TestRestTemplate或者WebClient发起HTTP请求,直接拿到Spring封装的响应对象,完全不需要接触JAX-RS的Response类型。
内容的提问来源于stack exchange,提问作者Dmytro Chasovskyi
相关产品推荐
相关产品推荐

