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

反序列化异常断言单元测试失败,预期与实际值一致仍报错

问题分析与修复方案

核心原因

你的deserialize函数内部已经捕获了IllegalArgumentException,并返回null而非重新抛出异常。这意味着当你用expectCatching调用该函数时,函数执行不会触发失败分支,而是返回一个包裹着null的Success结果。

测试里的isFailure()断言是在验证“函数执行时抛出了异常”,但实际函数并没有抛出异常——只是返回了null,这就导致测试断言与实际行为不匹配,最终失败。

修复方案

根据你的函数设计(失败时返回null),应该修改测试逻辑,验证返回值为null而非断言异常抛出:

fun testWhenMalformedJson() {
    val body = "test body"
    val bytes = SdkBytes.fromUtf8String(body)

    // 直接验证返回值为null
    deserialize(bytes) shouldBe null
}

如果你确实想测试“反序列化失败会抛出IllegalArgumentException”这个逻辑,应该单独测试Json.decodeFromString的行为,而非测试deserialize函数——因为deserialize的职责就是捕获该异常并返回null:

fun testJsonDecodeThrowsOnMalformedData() {
    val body = "test body"
    expectCatching {
        Json.decodeFromString<Response>(body)
    }
        .isFailure()
        .isA<IllegalArgumentException>()
}

总结

测试逻辑必须和被测函数的实际行为对齐:函数设计为失败返回null,就不要断言它抛出异常;若要测试异常抛出,就要针对未被捕获的代码逻辑编写测试。

内容的提问来源于stack exchange,提问作者CyberPunk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:07:12