2012-06-03 22 views
7

He intentado hacer una prueba de Spock para una clase, donde tengo que verificar que envíe un mensaje al actor (por ejemplo, statActor). Sé que Akka tiene una biblioteca especial para la prueba de integración, pero parece que es demasiado para una prueba muy simple. Por lo tanto, he intentado:Spock se burla de Akka's ActorRef

setup: 
def myActor = Mock(ActorRef) 
myService.statActor = myActor 
when: 
myService.startStats() 
then: 
1 * myActor.tell(_) 

método de destino se parece a:

void startStats() { 
    Date x = null 
    // prepare some data, fill x with required value 
    this.statActor.tell(x) 
} 

pensé que Spock creará maqueta con un método tell. Sin embargo, después de ejecutar esta prueba estoy consiguiendo:

java.lang.ClassCastException: akka.actor.ActorRef$$EnhancerByCGLIB$$80b97938 cannot be cast to akka.actor.ScalaActorRef 
    at akka.actor.ActorRef.tell(ActorRef.scala:95) 
    at com.example.MyService.startStats(MyService.groovy:32) 

Por qué se llama verdadera ActorRef aplicación? Algún tipo de incompatibilidad con Scala? ¿Hay alguna forma de burlarse de esa clase?

+1

"pero parece que es demasiado para una prueba muy simple" <- ¿puedo preguntar cómo se hace esta conclusión, especialmente teniendo en cuenta que la burla que probó no funcionó? –

+0

@ViktorKlang porque una línea 'def actor = Mock (ActorRef)' es menos que unas pocas docenas de líneas requeridas para 'testkit'. Quiero decir que puede hacer burla de otros objetos, funciona bien y es realmente fácil de usar –

+0

@paradigmatic sí, lo sé. probablemente estoy haciendo preguntas difíciles, pero ¿qué puedo hacer aquí? :( –

Respuesta

16

La única forma compatible para burlarse de un ActorRef es mediante la creación de un TestProbe:

// "system" is an ActorSystem 
final TestProbe probe = TestProbe.apply(system); 
final ActorRef mock = probe.ref; 

No puede ser más fácil o más simple que esto.

+0

Gracias. ¿Cómo puedo probar que se llame '.tell()' para este actor, con un valor que también puedo probar? –

+0

Existen muchos métodos para afirmar la recepción de mensajes en una sonda, enumerados en http://doc.akka.io/api/akka/2.0/akka/testkit/TestProbe.html – paradigmatic

+0

Oh, estaba seguro de que es lo mismo que 'TestActorRef' –

0

En specs2 que puede hacer:

val mockedActorRef = spy(TestProbe().ref) 

luego usarlo como normal.