2013-04-10 16 views
52

Mam test JUnit, który chcę czekać przez pewien czas synchronicznie. Moje testy JUnit wygląda następująco:Jak mogę czekać na test JUnit?

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

Próbowałem Thread.currentThread() wait(), ale zgłasza IllegalMonitorStateException (zgodnie z oczekiwaniami).. Czy jest jakaś sztuczka, czy potrzebuję innego monitora?

Odpowiedz

89

Co powiecie na ? :)

+8

Tak. Jestem kompletnym głupkiem. *westchnienie*. Muszę spać. – Kylar

+2

@Kylar Yep, sen jest ważny! Cieszę się, że wszystko jest dobrze. – Muel

34

Thread.sleep() może działać w większości przypadków, ale zazwyczaj, jeśli czekasz, czekasz na konkretny stan lub stan. Thread.sleep() nie gwarantuje, że cokolwiek na to czekasz, faktycznie się wydarzyło.

Jeśli czekasz na żądanie odpoczynku, na przykład, może zwykle powróci w ciągu 5 sekund, ale jeśli ustawisz swój sen na 5 sekund, w dniu, w którym twoja prośba wróci w ciągu 10 sekund, twój test się nie powiedzie.

Aby rozwiązać ten problem, JayWay ma znakomite narzędzie o nazwie Awatility, które jest idealne do zapewnienia, że ​​przed przejściem do pracy wystąpi określony stan.

Ma ładny biegle API oraz

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

https://github.com/jayway/awaitility

+0

Nie można uzyskać gotowości do kompilacji w Android Studio. –

+0

Czy dodałeś tę linię do ciebie gradle file: compile 'org.awaitility: awaitility: 3.0.0'? – Samoht

+0

nie. dodaj to w przypadku testowym, gdzie chcesz poczekać na konkretny warunek –

3

Można również użyć obiektu CountDownLatch jak wyjaśniono here.

Powiązane problemy