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?
"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? –
@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 –
@paradigmatic sì, lo so. probabilmente sto facendo domande difficili, ma cosa posso fare qui? :( –