Come posso aspettare che Scala Actor esca()? Ho impostato due attori in un test unitario e ho inviato alcuni messaggi per avviarli. Mandano alcuni messaggi avanti e indietro e alla fine entrambi chiamano exit(). Come faccio a fare in modo che il mio test unitario attenda che entrambi gli attori finiscano prima di passare?Attendi che un attore esca()
risposta
Se si conosce in anticipo il numero di messaggi scambiati tra gli attori, è possibile utilizzare uno java.util.concurrent.CountDownLatch
per tenere traccia del conteggio dei messaggi. Negli attori, dopo ogni elaborazione del messaggio, fare
latch.countDown()
e nel tuo thread principale fare
latch.await()
questo renderà la vostra attesa principale filo fino al conteggio del latch è fino a zero.
Se non si conosce il conteggio dei messaggi in anticipo, ma è presente una condizione che indica la fine, è possibile utilizzare java.util.concurrent.locks.Condition
. Nei attori, quando la sua condizione è soddisfatta, fare
if (conditionSatisfied)
condition.signal()
e nel tuo thread principale fare
while (!conditionSatisfied)
condition.await()
per rendere più aspettare che la condizione è soddisfatta.
Vedere le javadoc di CountDownLatch
e Condition
per i dettagli.
Vedere this Gist per esempio di Condition
.
Nelle specifiche è possibile utilizzare Eventually Matchers. Se si conosce lo stato finale del vostro attore o qualsiasi entità (ad esempio, la persistenza negozio) esso modifica, potrebbe essere forza di prova di aspettare, fino a quando si verificherà il passaggio a questo stato:
<entity state> must eventually(10, 1.second)(be(<state>)) // there will be 10 retires every second, and if the state will be different, exception is thrown
Ciò farebbe sì che l'unità di prova impieghi circa un decimo di secondo per funzionare, il che è troppo lento. –
- 1. Python: Avvia il nuovo prompt dei comandi su Windows e attendi che finisca/esca
- 2. Cattura un'applicazione python prima che esca
- 3. Attendi che SwingWorker finisca
- 4. LibGDX c'è un attore che è animato?
- 5. Come si verifica un attore Akka che invia un messaggio a un altro attore?
- 6. come lasciare che il parser stampi un messaggio di aiuto piuttosto che un errore ed esca
- 7. Attendi che un file venga creato con un timeout
- 8. Attendi che un elemento abbia un testo specifico con CasperJS
- 9. Come lasciare che un thread che blocca su recv() esca con garbo?
- 10. È una cattiva pratica inviare un attore a un messaggio da qualcosa che non è un attore?
- 11. Gestione di Future onSuccess come risposta da un attore Akka
- 12. Selezione attore
- 13. Angular2 attendi che siano chiuse più promesse
- 14. Attendi che i metodi asincroni finiscano in un ciclo for
- 15. Attendi che finiscano tutti i thread in un Executor?
- 16. Cellulaid corrente Sidekiq Attore
- 17. Akka Socket per attore
- 18. Quando si dovrebbe usare il modello di attore?
- 19. attore libcppa che genera attori su connessioni socket
- 20. Attendi l'input per un certo tempo
- 21. Attendi un numero sconosciuto di futuri
- 22. Attendi [NSAlert beginSheetModalForWindow: ...];
- 23. attendi in Parallel.foreach
- 24. Attendi più callback
- 25. attendi ogni jQuery
- 26. Test dell'interfaccia utente Swift2 - Attendi che l'elemento venga visualizzato
- 27. Attendi il permesso utente
- 28. Come testare un attore Akka che invia un messaggio a se stesso, senza usare Thread.sleep
- 29. Attendi che una particolare immagine si carichi completamente con jquery?
- 30. Attendi che l'elemento cambi il suo valore (testo)
potevo conto alla rovescia() poco prima exit() e conta solo fino a 1. Ciò sembra ridondante, poiché i due metodi sarebbero sempre chiamati insieme. –
Non capisco. Vuoi che il filo principale attenda fino a quando gli attori hanno finito, giusto? Questo è ciò che faranno le chiamate 'await()'. –
Significa che devo aggiungere un latch o una condizione al codice di produzione (gli attori) esclusivamente per un test JUnit (in attesa degli attori). –