【发布时间】:2019-10-07 12:15:45
【问题描述】:
我正在写一些Specs2规范;看起来像:
class ComponentSpecification extends Specification with Mockito {
private val dependency = mock[Dependency]
private val subject = new Component(..)
"methodOne" should {
"handle happy path" in {
val result = subject.methodOne("Param1", 42)
result must ...
there was one(dependency).something()
}
"deal with border case" in {
val result = subject.methodOne("", -1)
result must ...
there was one(dependency).something()
}
}
}
但是,这些测试失败了,因为 mock[Dependency] 是共享的。
- 一种解决方案是让它们按顺序排列并在每次测试之前重置模拟,但这看起来很奇怪,并且在文档中关于“默认情况下并行”中所写:
当给定示例的结果不应受到其他人的影响时,它鼓励编写独立示例
另一个是将
val移动到测试本身。但是,虽然我应该能够减少重复,但它仍然看起来像一个奇怪的结构。看起来subject是有状态的,但它不应该。-
我也可以尝试使用不那么严格的方法,通过
there was atLestOne(dependency).something()进行验证,但是:- 这并不能验证该方法是否在此特定测试用例中被调用,并且
- 参数捕获和验证很痛苦。
所以我的问题是:
如何在模拟上创建具有详细验证的可读测试。
非常感谢。
【问题讨论】: