【发布时间】:2018-11-20 10:49:43
【问题描述】:
我将 Mockito 与 ScalaTest 一起使用。考虑这个简化的例子。
模型案例类:
case class Batch(batchId: Long,
timestamp: Option[LocalDateTime] = Some(LocalDateTime.now),
invoicesReceived: Option[Int])
在我的测试中,我正在模拟一个名为 BatchRepository 的类,它有一个带有此签名的方法:
def create(conn: Connection, batch: Batch): Long
相关测试代码:
verify(batchRepository, times(1)).create(anyObject(),
Batch(anyLong(), anyObject(), Matchers.eq(Some(1))))
)
牛肉是:我想验证被测代码是否使用任何 Connection 和一个具有任何 id 和时间戳的 Batch 实例调用模拟存储库方法,但 invoicesReceived 恰好是 @ 987654325@。
使用 Mockito,这是否可能,如果可以,如何实现?
生产代码创建了一个新的 Batch ,它将时间戳设置为当前时刻,所以我认为在测试中为 verify() 调用创建一个具有完全相同时间戳的真正 Batch 对象几乎是不可能的。所以至少对于我需要anyObject()的时间戳。
我尝试了很多变体,例如将整个 Batch 包装在 Matchers.eq() 中,但我没有找到任何可行的方法:
参数匹配器的使用无效!预计 2 个匹配器,4 个记录 [...]
如果事实证明有一些替代方法可以使用 Mockito 来测试我想要的东西,我会很高兴听到我使用匹配器完全错误。 ????
(我很难为这个问题写一个好名字;如果你理解我在问什么并且可以更简洁地表达出来,请编辑或发表评论。)
【问题讨论】:
标签: scala unit-testing mockito scalatest hamcrest