You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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}")
    }
}

函数逻辑说明

  1. 先通过assertFailsWith<T>确保抛出的异常属于T类型体系(包含子类),并捕获该异常
  2. 用::class直接比较异常的实际类型与目标类型,确保两者完全一致(而非is关键字的类型兼容判断)
  3. 若类型不匹配,抛出明确的测试失败提示

针对网络栈场景的使用示例

验证断开连接场景抛出的是IOException本身,而非自定义子类:

// 断连场景测试:确保抛出IOException而非自定义异常
assertFailsWithExactType<IOException> {
    myNetworkRequestFun() // 断连时应触发原生IOException的函数
}

// 额外验证:确认不会抛出指定自定义子类
val exception = assertFailsWith<IOException> { myNetworkRequestFun() }
check(exception !is MyEmptyResponseError) { "断连场景不应抛出MyEmptyResponseError" }

内容的提问来源于stack exchange,提问作者m.reiter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:55:27