反序列化异常断言单元测试失败,预期与实际值一致仍报错
问题分析与修复方案
核心原因
你的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
相关产品推荐
相关产品推荐

