2012-06-03 9 views
7

Ich habe versucht, einen Spock-Test für eine Klasse zu machen, wo ich überprüfen muss, ob er eine Nachricht an den Akteur sendet (sagen wir statActor). Ich weiß, dass Akka eine spezielle Bibliothek für den Integrationstest hat, aber scheint, dass es für einen sehr einfachen Test zu viel ist. Also, ich habe versucht:Spock Mocks für Akka's ActorRef

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

Ziel Methode wie folgt aussieht:

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

Ich dachte, dass Spock Mock mit einer Methode tell schaffen. Aber nach diesen Test ausführen ich erhalte:

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) 

Warum es echte ActorRef Implementierung nennen? Irgendeine Art von Inkompatibilität mit Scala? Gibt es eine Möglichkeit, eine solche Klasse nachzuahmen?

+1

"aber scheint, dass es zu viel für sehr einfachen Test ist" <- darf ich fragen, wie diese Schlussfolgerung gemacht wird, besonders in Anbetracht der Tatsache, dass das Spott, das Sie versucht haben, nicht geklappt hat? –

+0

@ViktorKlang weil eine Zeile 'def actor = Mock (ActorRef)' weniger als ein paar Dutzend Zeilen für 'testkit' benötigt. Ich meine, es kann für andere Objekte mock machen, funktioniert gut und wirklich einfach zu bedienen –

+0

@paradigmatic ja, ich weiß. wahrscheinlich stelle ich harte Fragen, aber was kann ich hier machen? :( –

Antwort

16

Die einzige unterstützte Weg, um eine ActorRef zu verspotten ist durch eine TestProbe erstellen:

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

Es ist nicht leichter oder einfacher als dieses bekommen.

+0

Danke. Wie kann ich testen, dass '. Tell()' für diesen Akteur aufgerufen wird, mit einem Wert, den ich auch testen kann? –

+0

Es gibt viele Methoden zum Bestätigen von Nachrichtenempfang auf einer Sonde, aufgeführt auf http://doc.akka.io/api/akka/2.0/akka/testkit/TestProbe.html – paradigmatic

+0

Oh, ich war mir sicher, dass es das selbe wie 'TestActorRef' ist –

0

In specs2 können Sie tun:

val mockedActorRef = spy(TestProbe().ref) 

Dann ist es ganz normal verwenden.