2010-06-24 10 views
13

¿Cómo espero a que salga Scala Actor()? Configuré dos actores en una prueba unitaria y envío algunos mensajes para que comiencen. Envían algunos mensajes hacia adelante y hacia atrás y, finalmente, ambos llaman a exit(). ¿Cómo hago para que mi prueba unitaria espere que ambos actores terminen antes de aprobar?Esperar a que salga un actor()

Respuesta

7

Si conoce de antemano la cantidad de mensajes intercambiados entre los actores, puede usar un java.util.concurrent.CountDownLatch para realizar un seguimiento del recuento de mensajes. En los actores, después de cada proceso del mensaje, haga

latch.countDown() 

y en su hilo principal hacer

latch.await() 

Esto hará que su espera hilo principal hasta que el recuento del pestillo se ha reducido a cero.

Si no conoce el conteo de los mensajes por adelantado, pero tiene una condición que indica el final, entonces puede usar java.util.concurrent.locks.Condition. En los actores, cuando su condición se cumple, hacer

if (conditionSatisfied) 
    condition.signal() 

y en su hilo principal hacer

while (!conditionSatisfied) 
condition.await() 

para hacerla esperar hasta que la condición se cumple. Para obtener más información, consulte los javadocs de CountDownLatch y Condition.

Véase this Gist por ejemplo de usar Condition.

+1

pude cuenta atrás() justo antes exit() y solo cuenta a 1. Eso parece redundante, ya que los dos métodos siempre se llamarán juntos. –

+0

No lo entiendo Quieres que el hilo principal espere hasta que los actores hayan terminado, ¿verdad? Eso es lo que harán las llamadas 'await()'. –

+0

Significa que tengo que agregar un pestillo o condición al código de producción (los actores) puramente para una prueba de JUnit (esperando por los Actores). –

2

En Especificaciones puede usar Eventually Matchers. Si conoce el estado final de su actor o cualquier entidad (por ejemplo, la persistencia de la tienda) se modifica, es posible forzar prueba que esperar hasta que se produzca el cambio a este estado:

<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 
+1

Eso haría que la prueba de la unidad tardara aproximadamente una décima de segundo en ejecutarse, lo cual es demasiado lento. –

Cuestiones relacionadas