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
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 yapacaklatch.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 yapmakwhile (!conditionSatisfied)
condition.await()
do.
detaylar için CountDownLatch
ve Condition
ait javadocs bakın.
Condition
kullanılarak örneğin this Gist bakınız.
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
Bu, ünitenin test edilmesinin saniyenin onda birini almasını sağlar ki bu da çok yavaştır. –
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. –
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. –
Üretim kodu (aktörler) için bir JUnit testi (Oyuncuları beklerken) için bir mandal veya durum eklemem gerekiyor. –