2010-08-26 33 views
9

Estoy usando mockito y estoy intentando burlarme de un objeto scala.Objeto Scala 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 la muestra de objeto a clase, funciona. ¿Es posible burlarse de los objetos scala con mockito? Si es así, ¿cómo?

Respuesta

10

Como está escrito, su Sample es un singleton puro. Su tipo es propio y solo hay un miembro de ese tipo, punto. Scala object s puede extender otra clase (posiblemente abstracta, si proporciona las definiciones necesarias para que sea concreta) y rasgos. Hacer eso le da un tipo de identidad que incluye esos antepasados.

No sé lo que Mockito realmente está haciendo, pero en mi opinión, lo que estás pidiendo está estrictamente en desacuerdo con lo que es un Scala object.

+3

Definitivamente estoy de acuerdo aquí. Es posible que pueda probar el simulacro [Sample.type], pero dudo que funcione en la práctica. Recomiendo que Sample extienda algunos rasgos de la interfaz y se burle de esa manera. El gran problema es que si quieres inyectar tu simulacro en lugar de la muestra única, tendrás que hacer magia agradable, malvada y divertida. Si estás interesado, podemos publicar eso. – jsuereth

+0

Estaba mirando el código fuente de Mockito el otro día para responder una pregunta relacionada (que por alguna razón no puedo encontrar, ahora) y parece recordar haber visto uno de los generadores "falsos" que simplemente devuelve un valor específico en lugar de intentarlo para generar alternativas/variantes. –

+0

¿Hay alguna manera de hacer esto con Powermock o similar? Si tengo un método (efectivamente global) en un objeto complementario, parece razonable querer burlarme de su comportamiento; sin duda este es un patrón común en el mundo ruby. – Korny

6

Tenga en cuenta que usted puede simulacros 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 de la persona objeto, pero el método en él (que es, probablemente, donde el PO tenía la intención).

El resultado de la prueba muestra funciona la 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 los tiempos de producción de la ClassUnderTest es simplemente new ClassUnderTest debido a la función inyectada ser un argumento predeterminado.

9

Recientemente he lanzado ScalaMock, una biblioteca burlona para Scala que puede, entre otras cosas, simular objetos singleton (y complementarios).

+4

En la página provista, el soporte para objetos individuales y complementarios se declara en la sección titulada "Planes futuros". ¿El marco actualmente admite esas características? – Zotov

+2

@Zotov, parece que el soporte para burlarse de objetos solo está disponible en ScalaMock2 con el uso de un plugin de compilación 2.9, como se explica en este [tutorial] (http://paulbutcher.com/2011/11/06/scalamock- paso a paso/). ScalaMock3 no requiere un complemento de compilación ya que depende de Scala 2.10 macros en su lugar, pero todavía no es compatible con todas las funciones de ScalaMock2, como se menciona en esta [publicación del blog] (http://paulbutcher.com/2012/06/04/scalamock-3-0-preview-release /). Los objetos burlones no son compatibles en 2.10): Por lo que puedo decir, ese parece ser el estado actual del proyecto. –

+0

Esta biblioteca aún no funciona bastante bien – danielrvt