【发布时间】:2014-08-13 18:41:16
【问题描述】:
我正在尝试模拟一个 Scala 单例对象。特别是,我需要模拟在服务组件(被测类)中使用的对象play.api.libs.ws.WS。
使用 Mockito 这是不可能的,测试执行会以下列方式失败:
[error] MockitoException: :
[error] Cannot mock/spy class play.api.libs.ws.WS$
[error] Mockito cannot mock/spy following:
[error] - final classes
[error] - anonymous classes
[error] - primitive types (GeolocationSpec.scala:18)
阅读here,Scalamock 似乎允许这样做:
要模拟一个独立的单例对象,请使用
org.scalamock.annotation.mockObject.
我的服务组件是这样的:
trait GeolocationService {
def wsClient = WS
def getPath(origin: Location, destination: Location): Future[Route]
}
class DefaultGeolocationService extends GeolocationService {
val serviceProviderEndpoint = Play.current.configuration.getString("api.directions.endpoint")
override def getPath(origin: Location, destination: Location): Future[Route] = {
val params = Seq(
"origin" -> s"${origin.lat},${origin.lon}",
"destination" -> s"${destination.lat},${destination.lon}"
);
val resp = wsClient.url(serviceProviderEndpoint.get).withQueryString(params: _*).get()
resp.map {
// omitted code
}
}
}
我的 build.sbt 有所有这些依赖项:
[...]
"org.scalatest" %% "scalatest" % "2.2.1",
"org.specs2" %% "specs2" % "2.3.13" % "test",
"org.scalamock" %% "scalamock-specs2-support" % "3.0.1" % "test",
"org.scalamock" %% "scalamock-scalatest-support" % "3.0.1" % "test",
"org.scalamock" %% "scalamock" % "3.0.1",
[...]
但我找不到这个:org.scalamock.annotation.mockObject
也许这也可以使用 EasyMock 和 PowerMock 来完成,但我找不到任何 Scala 示例代码。
有什么想法吗?
【问题讨论】:
-
模拟它实现的接口。将该接口作为使用它的依赖项。
-
你怎么称呼它?喜欢
mock [WS.type]还是其他方式? -
我第二个@PolymorphicPotato。不幸的是,Play 的 WS 是一个对象,而不是通用特征的实现。如果您可以使用 WS 添加简短的代码 sn-p,我们可以指导您将其与 WS 解耦并使其更容易模拟。
-
@wheaties 是的,我发现使用 Mockito 模拟对象而没有编译错误的唯一方法是
mock[WS.type],但它不起作用。 -
@PolymorphicPotato 你能准确地告诉我你的意思吗?对于 WS 单例对象,你会模拟哪个接口?
标签: scala testing playframework mocking singleton