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

如何在Scala中用assertThrows断言自定义异常的错误信息?

如何在Scala测试中捕获自定义异常并断言错误消息

我定义了一个自定义运行时异常:

case class AEMAuthenticationException(
  message: String
) extends RuntimeException(message)

编写测试时使用assertThrows可以成功验证异常抛出:

assertThrows[AEMAuthenticationException] {
  AEMUtils.validateAEMRequest[AEMFragment](
    status = 401,
    resBody = resBody
  )
}

但现在需要区分不同错误消息的认证异常,想获取异常实例并断言其错误消息,之前尝试的写法无法生效,该怎么实现?


解决方案1:使用intercept捕获异常并断言

ScalaTest提供的intercept方法会捕获指定类型的异常并返回实例,直接对其消息做断言即可:

val exception = intercept[AEMAuthenticationException] {
  AEMUtils.validateAEMRequest[AEMFragment](
    status = 401,
    resBody = resBody
  )
}
// 基础断言方式
assert(exception.getMessage == "Expired Credentials")
// 或使用ScalaTest匹配器更直观
exception.getMessage shouldBe "Expired Credentials"

解决方案2:ScalaTest 3.x+ 下的assertThrows进阶用法

若偏好assertThrows,在ScalaTest 3.x及以上版本中,可通过双参数列表的方式传入断言逻辑:

assertThrows[AEMAuthenticationException](ex =>
  ex.getMessage shouldBe "Expired Credentials"
) {
  AEMUtils.validateAEMRequest[AEMFragment](
    status = 401,
    resBody = resBody
  )
}

注意:这里断言函数是第一个参数列表,抛出异常的代码块是第二个参数列表——你之前的写法把代码块放在了断言函数内部,会导致异常提前抛出,断言逻辑无法执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:41:36