Как я могу заставить тест JUnit ждать?



У меня есть тест JUnit, который я хочу иметь ждать в течение определенного периода времени, синхронно. Мой тест JUnit выглядит так:



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


я попробовал нить.currentThread().ждать(), но он бросает IllegalMonitorStateException(как и ожидалось). Есть ли какой-то трюк, или мне нужен другой монитор?

621   4  

4 ответов:

как о Thread.sleep(2000); ? :)

нить.sleep () может работать в большинстве случаев, но обычно, если вы ждете, вы на самом деле ждете определенного состояния или состояния. Нитка.sleep () не гарантирует, что все, что вы ждете, действительно произошло.

Если вы ждете запроса на отдых, например, возможно, он обычно возвращается через 5 секунд, но если вы установите свой сон на 5 секунд в день, когда ваш запрос возвращается через 10 секунд, ваш тест будет неудачным.

чтобы исправить это JayWay имеет большую утилиту под названием Awatility который идеально подходит для обеспечения того, возникает специфическое состояние, прежде чем двигаться дальше.

Он также имеет хороший свободный api

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

https://github.com/jayway/awaitility

вы также можете использовать CountDownLatch объект, как пояснил здесь.

в случае, если ваш статический анализатор кода (например, SonarQube) жалобы, но вы не можете думать о другом способе, а не спать, вы можете попробовать с рубить, как: Awaitility.await().pollDelay(Duration.ONE_SECOND).until(() -> true); Это концептуально неверно, но это то же самое, что Thread.sleep(1000).

лучший способ, конечно, передать вызываемый, с вашим соответствующим условием, а не true, которые у меня есть.

https://github.com/awaitility/awaitility

Comments

    Ничего не найдено.