如何在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
相关产品推荐
相关产品推荐

