2010-06-24 44 views
13

Scala Aktörünün çıkışını nasıl beklerim()? Bir birim testinde iki Aktör kurdum ve başlamasına yardımcı olmak için birkaç mesaj yolluyorum. Birkaç iletiyi ileri ve geri gönderirler ve sonunda ikisi de exit() çağırır. Birim testimi hem Aktörlerin geçmeden önce bitirmesi için nasıl beklerim? Önceden biliyorsanızBir Aktörün çıkmasını bekleyin()

cevap

7

mesajların sayısı aktörleri arasında, mesajların sayısı izlemek için bir java.util.concurrent.CountDownLatch kullanabilirsiniz alışverişinde bulundu. aktörler olarak, iletinin her işlem sonrasında,

latch.countDown() 

ve ana iş parçacığı

mandalın sayım sıfıra olduğu kadar ana iş parçacığı bekleme yapacak
latch.await() 

Bu

do. Önceden mesajların sayısını biliyorum ama bitirmek gösteren bir durumun yoksa

, o zaman java.util.concurrent.locks.Condition kullanabilirsiniz. Durumunuz memnun olduğunda aktörler olarak,

if (conditionSatisfied) 
    condition.signal() 

ve ana iş parçacığı

koşul yerine getirildiğinde kadar bekleyebilir yapmak
while (!conditionSatisfied) 
condition.await() 

do.

detaylar için CountDownLatch ve Condition ait javadocs bakın.

Condition kullanılarak örneğin this Gist bakınız.

+1

Ben hemen önce geri sayım() olabilir exit() ve sadece 1'e kadar sayın. Bu iki yöntem her zaman birlikte çağrılacağı için gereksiz görünüyor. –

+0

Anlamadım. Ana iş parçacığının aktörler bitene kadar beklemesini istiyorsun, değil mi? 'Bekle() 'çağrılarının yapacağı şey budur. –

+0

Üretim kodu (aktörler) için bir JUnit testi (Oyuncuları beklerken) için bir mandal veya durum eklemem gerekiyor. –

2

Spesifikasyonlarda Eventually Matchers'u kullanabilirsiniz. Eğer aktör son aşamasına veya herhangi bir kuruluş biliyorsanız (diyelim ki, kalıcılık deposu) Bu duruma geçiş meydana gelecektir kadar, beklemek testi zorlayabilir, değiştirir:

<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

Bu, ünitenin test edilmesinin saniyenin onda birini almasını sağlar ki bu da çok yavaştır. –

İlgili konular