如何在Kotlin.Test中断言函数抛出异常但非指定子类型?
实现Kotlin.Test自定义断言:严格验证抛出指定父类异常(排除子类)
在使用Kotlin.Test时,assertFailsWith<IOException> { myFun() }会匹配所有继承自IOException的子类,但我们需要确保抛出的是IOException本身,而非其自定义子类(比如因Retrofit限制必须继承IOException的MyEmptyResponseError)。
自定义断言实现
我们可以编写一个自定义断言函数,严格检查抛出异常的类型与目标类型完全一致,而非兼容子类:
import kotlin.test.assertFailsWith import kotlin.test.fail inline fun <reified T : Throwable> assertFailsWithExactType(block: () -> Unit) { val thrownException = assertFailsWith<T>(block) if (thrownException::class != T::class) { fail("Expected exception of type ${T::class.simpleName}, but got ${thrownException::class.simpleName}") } }
函数逻辑说明
- 先通过
assertFailsWith<T>确保抛出的异常属于T类型体系(包含子类),并捕获该异常 - 用
::class直接比较异常的实际类型与目标类型,确保两者完全一致(而非is关键字的类型兼容判断) - 若类型不匹配,抛出明确的测试失败提示
针对网络栈场景的使用示例
验证断开连接场景抛出的是IOException本身,而非自定义子类:
// 断连场景测试:确保抛出IOException而非自定义异常 assertFailsWithExactType<IOException> { myNetworkRequestFun() // 断连时应触发原生IOException的函数 } // 额外验证:确认不会抛出指定自定义子类 val exception = assertFailsWith<IOException> { myNetworkRequestFun() } check(exception !is MyEmptyResponseError) { "断连场景不应抛出MyEmptyResponseError" }
内容的提问来源于stack exchange,提问作者m.reiter
相关产品推荐
相关产品推荐

