kotlin - 模拟每个 {}.throws() 异常失败测试
问题描述
当先前的方法调用引发异常时,我需要验证是否未进行某个调用。
// GIVEN
every { relaxedMock.eats() }.throws(NotHungryException())
// WHEN
sut.live()
// THEN
verify (exactly = 0) { relaxedMock2.sleeps() }
这段代码有问题,它失败是因为抛出了异常,而不是因为验证失败。
解决方案
我了解您的WHEN块将始终引发异常。在这种情况下,从我的角度来看,您有多种选择:
- 简单朴素的 Kotlin。用 try-catch 块包装WHEN块,例如:
// GIVEN
every { relaxedMock.eats() }.throws(NotHungryException())
// WHEN
var exceptionThrown: Boolean = false
try {
sut.live()
} catch(exception: NotHungryException) {
// Maybe put some assertions on the exception here.
exceptionThrown = true
}
assertTrue(exceptionThrown)
// THEN
verify (exactly = 0) { relaxedMock2.sleeps() }
- 对于更好的代码,您可以使用JUnit5 API 的 Assertions。
assertThrows
将期望特定代码段引发异常。如果没有抛出异常,它将无法通过测试。它还将返回抛出的异常,供您检查。
import org.junit.jupiter.api.Assertions
// GIVEN
every { relaxedMock.eats() }.throws(NotHungryException())
// WHEN
val exception = Assertions.assertThrows(NotHungryException::class.java) { sut.live() }
// THEN
verify (exactly = 0) { relaxedMock2.sleeps() }
- 如果你使用Kotest,你可以使用
shouldThrow
断言。这还允许您检索抛出的异常并验证其类型。
import io.kotest.assertions.throwables.shouldThrow
// GIVEN
every { relaxedMock.eats() }.throws(NotHungryException())
// WHEN
val exception = shouldThrow<NotHungryException> { sut.live() }
// THEN
verify (exactly = 0) { relaxedMock2.sleeps() }
推荐阅读
- python - 自定义 Python 图例
- sql-server - 确定 TFS 2015 正在使用的 SQL Server 实例
- r - 在 Shiny 中为表格的每一行选择输入
- java - 该项目在包含标记中找不到 jsp 文件
- python - 使用传递给 Python 函数的字典值
- angular-material - 如何获取 mat-nav-list 的选定链接的值
- ruby-on-rails - rails db:seed 失败并出现 `LoadError: cannot load such file -- JSON` 尽管 Gemfile 中有 `'json`'
- sum - 不同工作组之间的 OpenCL Sum 减少给出了错误的结果
- ios - Swift - 访问 UIVIewcontroller 可变数组到 UITableViewCell 类
- javascript - Atom 在特定目录中使用 API 创建新文件