2012-06-03 14 views
7

Ho provato a fare un test di Spock per una classe, in cui ho bisogno di verificare che invii un messaggio all'attore (ad esempio statActor). So che Akka ha una libreria speciale per il test di integrazione, ma sembra che sia troppo per un test molto semplice. Così, ho provato:Spock mock per Akka's ActorRef

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

metodo di destinazione si presenta come:

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

ho pensato che Spock creerà finta con un metodo tell. Ma dopo l'esecuzione di questo test mi sto:

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) 

Perché sta chiamando reale ActorRef implementazione? Qualche incompatibilità con Scala? C'è un modo per prendere in giro questa classe?

+1

"ma sembra che sia troppo per un test molto semplice" <- Posso chiederti come viene formulata questa conclusione, soprattutto considerando che il derisione che hai provato non ha funzionato? –

+0

@ViktorKlang perché una riga 'def actor = Mock (ActorRef)' è meno di poche dozzine di righe richieste per 'testkit'. Voglio dire che può rendere il mock per altri oggetti, funziona bene e davvero facile da usare –

+0

@paradigmatic sì, lo so. probabilmente sto facendo domande difficili, ma cosa posso fare qui? :( –

risposta

16

L'unico modo supportato per deridere un ActorRef è la creazione di un TestProbe:

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

Non c'è niente di più facile o più semplice di questo.

+0

Grazie, come posso provare che '.tell()' è chiamato per questo attore, con un valore che posso anche testare? –

+0

Ci sono molti metodi per affermare la ricezione di un messaggio su un probe, elencati su http://doc.akka.io/api/akka/2.0/akka/testkit/TestProbe.html – paradigmatic

+0

Oh, ero sicuro che è lo stesso di 'TestActorRef' –

0

In specs2 si può fare:

val mockedActorRef = spy(TestProbe().ref) 

quindi utilizzarlo come normale.

Problemi correlati