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?

¿Fue útil?

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. objects 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top