2013-04-10 162 views
52

我有一個JUnit測試,我想等待一段時間,同步。我的JUnit測試是這樣的:如何讓JUnit測試等待?

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

我試過Thread.currentThread()等待(),但它拋出一個拋出:IllegalMonitorStateException(正如預期的那樣)。是否有一些技巧,或者我需要一個不同的顯示器?

回答

89

Thread.sleep(2000);怎麼樣? :)

+8

是的。我是一個完整的白癡。 *嘆*。必須睡覺。 – Kylar 2013-04-10 23:55:37

+2

@Kylar是的,睡眠很重要!現在很高興一切都很好。 – Muel 2013-04-11 00:48:28

34

Thread.sleep()可以在大多數情況下工作,但通常如果您在等待,您實際上正在等待特定的條件或狀態發生。 Thread.sleep()並不保證你正在等待的東西實際上已經發生了。

如果您正在等待休息請求,例如通常可能會在5秒內返回,但如果您在10秒內將您的請求恢復爲5秒,您的測試將失敗。

爲了解決這個問題JayWay有一個很好的實用工具,叫做Awatility,它非常適合確保在您繼續前進之前發生特定情況。

它有一個很好的流暢API以及

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

https://github.com/jayway/awaitility

+0

我無法獲得在Android Studio中編譯的等待權限。 – 2016-09-30 15:42:04

+0

您是否將此行添加到您的gradle文件中:compile'org.awaitility:awaitility:3.0.0'? – Samoht 2017-11-27 10:10:40

+0

沒有。你可以在一個你想等待特定條件的測試案例中加入它 – 2017-12-02 13:56:39

3

你也可以使用CountDownLatch的物體,像解釋here