在 Specs2 Mockito 中使用带有 java.lang.UUID 的 eq 匹配器

Using an eq matcher with java.lang.UUID in Specs2 Mockito

我们最近更改了一项服务的 API,它以前是:

def updateSubtitle(subtitleId: String...): Subtitle

现在是:

def updateSubtitle(subtitleId: UUID, ...): Subtitle

之前我们这样写我们的期望:

there was one(subtitleService).updateSubtitle(eq(subtitleId), ...)

这将不再有效,因为 subtitleId 现在是 UUID 而不是 String。我不得不将 eq(subtitleId) 更改为 any[UUID] 但这太笼统了,因为它实际上并没有测试 subtitleId 值,它只关心 [=15= 类型的值]通过了。

如何让 eq 匹配器与 UUID 一起工作?

eq(subtitleId) 确实适用于 UUID,因为 UUID.equals 方法已正确实施(https://docs.oracle.com/javase/6/docs/api/java/util/UUID.html#equals(java.lang.Object).

您可能遇到 scala.AnyRef.eqorg.mockito.Matchers.eq 之间的命名冲突问题(参见 https://github.com/etorreborre/specs2/issues/361)。这可以通过以下任一方式解决:

  • 完全引用 Matchers.eq(即 one(subtitleService).updateSubtitle(org.mockito.Matchers.eq(subtitleId), ...))或
  • 使用 Scala 导入别名更改 Matchers.eq 名称(即 import org.mockito.Matchers.{eq => meq, _} 并将匹配器的使用相应地更改为 meq(subtitleId)