为何Ktor单元测试抛出异常而非返回500状态码响应?
问题修复方案
你的测试失败原因是:当前的StatusPages仅配置了对InternalServerError状态码的响应处理,并未拦截全局未捕获的Exception。当路由中抛出Exception时,框架没有对应的处理器将其转换为500响应,而是直接抛出异常导致测试中断。
修复方法是在StatusPages中添加针对Exception的全局拦截逻辑,将未捕获的异常映射为500状态码响应:
@Test fun genericExceptionShouldRespondWithInternalServerError() = testApplication { //given val expectedHttpStatus = HttpStatusCode.InternalServerError val expectedResponseText = "Internal Server Error" application { install(StatusPages) { // 新增:拦截所有未捕获的Exception,转换为500响应 exception<Exception> { call, cause -> call.respondText( text = "Internal Server Error", status = HttpStatusCode.InternalServerError ) } // 保留原有的状态码处理(可选,若有其他场景需要) status(HttpStatusCode.InternalServerError) { call, status -> call.respondText(text = "Internal Server Error", status = status) } } routing { get("/servererror") { throw Exception("Generic Exception") } } } //when val response = client.get("/servererror") //then assertEquals(expectedHttpStatus, response.status) assertEquals(expectedResponseText, response.bodyAsText()) }
关键改动说明:
- 添加
exception<Exception>处理器,捕获所有未被处理的Exception - 在处理器中将异常转换为指定的500响应内容和状态码
这样测试运行时,抛出的Exception会被StatusPages拦截并转换为500响应,测试就能正常验证状态码和响应文本了。
内容的提问来源于stack exchange,提问作者aalonzo
相关产品推荐
相关产品推荐

