objeto Scala Mocking
Pregunta
Estoy utilizando Mockito y tratando de burlarse de un objeto Scala.
object Sample { }
//test
class SomeTest extends Specification with ScalaTest with Mockito {
"mocking should succeed" in {
val mockedSample = mock[Sample]
}
}
Esto me da dos errores de compilación.
error: Not found type Sample
error: could not find implicit value for parameter m:
scala.reflect.ClassManifest[<error>]
Si cambio de la muestra de un objeto a la clase funciona. Es que es posible que los objetos simulados Scala con Mockito? Si es así, ¿cómo?
Solución
Como está escrito, su Sample
es un producto único puro. Su tipo es por sí mismo y sólo hay un miembro de ese tipo, y punto. object
s Scala puede ampliar otra clase (posiblemente abstracto, si se suministra las definiciones necesarias para que sea un hormigón) y rasgos. Haciendo lo que le da una identidad tipo que incluye aquellos antepasados.
No sé lo que está haciendo realmente Mockito, pero en mi opinión, lo que está pidiendo es estrictamente en desacuerdo con lo que un object
Scala es.
Otros consejos
Tenga en cuenta que puede burlarse de los métodos de un object
si los levanta a las funciones.
case class Person(name: String)
object Person {
def listToJson(lp: List[Person]) = "some actual implementation"
}
class ClassUnderTest(listToJson: (List[Person]) => String = Person.listToJson(_)) {
def testIt(lp: List[Person]) = listToJson(lp)
}
import org.specs._
import org.specs.mock.Mockito
import org.mockito.Matchers._
class ASpec extends Specification with Mockito {
"a thing" should {
"do whatever" in {
val m = mock[(List[Person]) => String]
val subject = new ClassUnderTest(m)
m(Nil) returns "mocked!"
subject.testIt(Nil) must_== "mocked! (this will fail on purpose)"
}
}
}
Aquí no estoy burlando el objeto persona, pero el método en el mismo (que es probablemente lo que el PO tenía la intención).
Las pruebas resultado muestra las obras de burla:
[info] == ASpec ==
[error] x a thing should
[error] x do whatever
[error] 'mocked![]' is not equal to 'mocked![ (this will fail on purpose)]' (ASpec.scala:21)
[info] == ASpec ==
Mientras tanto, el uso de tiempo de producción de la ClassUnderTest
es simplemente new ClassUnderTest
debido a la función inyectada ser un argumento predeterminado.
Me ha salido recientemente ScalaMock , una biblioteca burlarse de Scala que puede, entre otras cosas, Singleton maqueta (y compañero) objetos.