2013-04-10 19 views
52

Ben eşzamanlı, ben bir süre için beklemek zorunda istediğiniz bir JUnit test var.) (Bekle() JUnit Testini nasıl bekletebilirim?

@Test 
public void testExipres(){ 
    SomeCacheObject sco = new SomeCacheObject(); 
    sco.putWithExipration("foo", 1000); 
    //WAIT FOR 2 SECONDS 
    assertNull(sco.getIfNotExipred("foo")); 
} 

Ben Thread.currentThread çalıştı, ancak (Beklendiği gibi) bir IllegalMonitorStateException atar. Benim JUnit test buna benzemez. Bazı hile var mı yoksa farklı bir monitöre mi ihtiyacım var?

cevap

89

ne dersiniz Thread.sleep(2000);? :)

+8

Evet. Ben tam bir moronum. *iç çekmek*. Uyuyalım. – Kylar

+2

@Kylar Yep, uyku önemlidir! Sevindim, şimdi iyi. – Muel

34

Thread.sleep() çoğu durumda işe yarayabilir, ancak bekliyoruz genellikle eğer, gerçekte oluştuğu bir durum veya devlet bekliyor. Thread.sleep(), beklediğiniz her şeyin gerçekten gerçekleştiğini garanti etmez. Örneğin bir dinlenme istek üzerine bekleyen varsa

belki genellikle 5 saniye içinde geri döner, siz 5 saniye gün için uyku ayarlarsanız isteğiniz test başarısız olacak 10 saniye içinde geri gelir.

bu JayWay Devam etmeden önce belirli bir koşul oluştuğunda sağlamak için mükemmeldir Awatility denilen büyük yarar vardır düzeltmek için.

O da

await().until(() -> 
{ 
    return yourConditionIsMet(); 
}); 

https://github.com/jayway/awaitility

+0

Android Studio'da derlemek için bekleyemiyorum. –

+0

Bu satırı not defterine eklediniz: compile 'org.awaitility: awaitility: 3.0.0'? – Samoht

+0

no. Bunu, belirli bir koşulu beklemek istediğiniz bir test vakasına eklersiniz –

3

here açıkladı gibi de CountDownLatch nesnesi kullanabilirsiniz güzel akıcı API vardır.