我有个特点
trait Writer[T <: Attribute] {
def read(boundingBox: BoundingBox): Future[List[T]]
}
和一个case类
case class WriterImpl[T <: Attribute]()(implicit manifest: Manifest[T]) extends Writer[T] with LazyLogging {
override def read(boundingBox: BoundingBox): Future[List[T]] = {
}
..
}
在Test类中,我想模拟方法read()
我用精确值试过了
val writer = mock[WriterImpl[Attrib]]
when(writer.read(new BoundingBox(41.90178412, 41.8798685, -87.62687021, -87.64884287)))
.thenReturn(Future.successful(scala.collection.immutable.List(list)))
verify(writer).read(new BoundingBox(41.90178412, 41.8798685, -87.62687021, -87.64884287))
也尝试了
val writer = mock[WriterImpl[Attrib]]
when(writer.read(ArgumentMatchers.any()))
.thenReturn(Future.successful(scala.collection.immutable.List(list)))
verify(writer).read(ArgumentMatchers.any())
它调用的不是mock方法,而是实际方法
1条答案
按热度按时间ygya80vv1#
在第一个范例中,问题是您使用两个不同的
BoundingBox
对象做为read
方法的参数:一个用于when
,另一个用于verify
。它们不会匹配,因为在运行时它们是同一个BoundingBox
类的不同示例。您应该使用同一个对象。将它存储在when
子句之前,然后调用verify
并传递同一个对象。我假设您刚刚删除了
when
和verify
子句之间任何地方对writer.read(...)
的明显调用。verify
至少需要一个对read
的调用,否则将抛出"Wanted but not invoked: writerImpl.read(...); Actually, there were zero interactions with this mock.."
第二个示例应该可以运行,但是如果您尝试检查结果,仍然会遇到相同的问题。一个在
when
中,另一个在verify
中。由于它们在运行时是两个不同的对象,因此它们将不匹配:该输出确认运行时看到2个不同的示例:
同样,只需将
Future
存储在when
之前,并将相同的Future
传递给when
和shouldBe
。通过这些调整,这应该可以工作。检查read
的结果,确认从调用中返回了相同的Future
:这是我的
build.sbt
,如果您需要的话: