2015-01-09 15 views
6

Vorrei spiare l'istanza del mio attore, ma non può essere semplicemente creato con una nuova parola chiave. Ho capito la seguente soluzione:Spionaggio con mockito sull'attore Akka

val testActorSpy = spy(TestActorRef(new TestActor).underlyingActor) 
    val testActorRef = TestActorRef(testActorSpy) 

ma in questo modo creo un attore non necessario. C'è una soluzione più pulita?

risposta

0

Quindi la mia comprensione del sistema Akka Actor è che dovresti farlo attraverso le proprietà, giusto?

Quindi crea l'attore tramite Puntelli e quando è in prova restituisci una spia all'attore.

quindi questo dovrebbe dare un risultato:

val testActorRef = TestActorRef(spy(new TestActor)) 
val testActorSpy = testActorRef.underlyingActor 

essere consapevoli che l'underlyingActor viene distrutta quando l'attore viene riavviato. così beffardo questo potrebbe non essere l'opzione migliore.

Se si utilizza direttamente l'attore piuttosto che attraverso il sistema, si potrebbe essere in grado di testare anche le cose e bypassando il sistema sottostante filettato.

Vedere this (codice incolla sotto per java).

static class MyActor extends UntypedActor { 
    public void onReceive(Object o) throws Exception { 
    if (o.equals("say42")) { 
     getSender().tell(42, getSelf()); 
    } else if (o instanceof Exception) { 
     throw (Exception) o; 
    } 
    } 
    public boolean testMe() { return true; } 
} 

@Test 
public void demonstrateTestActorRef() { 
    final Props props = Props.create(MyActor.class); 
    final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testA"); 
    final MyActor actor = ref.underlyingActor(); 
    assertTrue(actor.testMe()); 
} 
+0

L'unico metodo pubblico di un attore dovrebbe essere "onReceive". Altrimenti, l'immutabilità è a rischio. In questo caso, se il metodo 'testMe' modifica lo stato dell'attore, tale principio viene violato. 'testMe' dovrebbe essere privato. Per accedere ai metodi privati ​​sui test JUnit con Spring, usa il 'ReflectionTestUtils'. –

+0

Rendilo privato quindi. Esistono molti modi per modificare la visibilità. Tutti quelli che lavorano sul nostro codice sono consapevoli che lo stato condiviso mutabile è cattivo. E ActorRef non espone le funzioni pubbliche. Quindi non è stato un problema. Le nostre condizioni di gara sono venute dalla chiusura rispetto allo stato privato. – Alex

+0

Hai ragione. I metodi pubblici all'interno di un attore non sono esposti. Ho solo la sensazione che sia un odore di codice. Ma dal punto di vista funzionale, hai ragione. In ogni caso, nel caso in cui qualcun altro voglia mantenere i propri metodi privati, ricorda che possono essere chiamati con 'ReflectionTestUtils' –