Я пытаюсь высмеять объект Scala singleton. В частности, мне нужно высмеять объект 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)
Чтение здесь, похоже, что 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
}
}
}
My 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.
Любая идея?