Kyl*_*lar 76 java junit thread-safety
我有一个JUnit测试,我希望等待一段时间,同步.我的JUnit测试看起来像这样:
@Test
public void testExipres(){
SomeCacheObject sco = new SomeCacheObject();
sco.putWithExipration("foo", 1000);
//WAIT FOR 2 SECONDS
assertNull(sco.getIfNotExipred("foo"));
}
Run Code Online (Sandbox Code Playgroud)
我尝试了Thread.currentThread().wait(),但它抛出了IllegalMonitorStateException(如预期的那样).是否有一些技巧,或者我需要一个不同的显示器?
Mue*_*uel 113
怎么样Thread.sleep(2000);
?:)
Ben*_*ser 56
Thread.sleep()在大多数情况下都可以工作,但通常如果你在等待,你实际上正在等待特定的条件或状态发生.Thread.sleep()不保证您正在等待的任何事实实际发生.
如果您正在等待休息请求,例如它通常可以在5秒内返回,但如果您在10秒内将请求恢复到5秒钟,那么您的测试将会失败.
为了解决这个问题,JayWay有一个很棒的实用工具叫做Awatility,它非常适合在你继续前进之前确保特定情况发生.
它有一个很好的流利api
await().until(() ->
{
return yourConditionIsMet();
});
Run Code Online (Sandbox Code Playgroud)
https://github.com/jayway/awaitility
小智 26
您可以使用内部使用 Thread.sleep 的 java.util.concurrent.TimeUnit 库。语法应如下所示:
@Test
public void testExipres(){
SomeCacheObject sco = new SomeCacheObject();
sco.putWithExipration("foo", 1000);
TimeUnit.MINUTES.sleep(2);
assertNull(sco.getIfNotExipred("foo"));
}
Run Code Online (Sandbox Code Playgroud)
该库为时间单位提供了更清晰的解释。您可以使用“小时”/“分钟”/“秒”。
Phi*_*zen 12
Mockito(已经通过 Spring Boot 项目的传递依赖项提供)有几种方法来等待异步事件或条件的发生。
\n目前对我们来说非常有效的一个简单模式是:
\n// ARRANGE \xe2\x80\x93 instantiate Mocks, setup test conditions\n\n// ACT \xe2\x80\x93 the action to test, followed by:\nMockito.verify(myMockOrSpy, timeout(5000).atLeastOnce()).delayedStuff();\n// further execution paused until `delayedStuff()` is called \xe2\x80\x93 or fails after timeout\n\n// ASSERT \xe2\x80\x93 assertThat(...)\n
Run Code Online (Sandbox Code Playgroud)\n@fernando-cejas在本文中描述了两个稍微复杂但更复杂的方法
\n关于此处给出的当前最佳答案,我的紧急建议是:您希望您的测试能够
\n...所以不要Thread.sleep()
在测试代码中愚蠢地使用。
相反,让您的生产代码使用依赖注入(或者,有点“肮脏”,公开一些可模拟/可监视的方法),然后使用 Mockito、Awaitly、ConcurrentUnit或其他方法来确保在断言发生之前满足异步先决条件。
\n如果在测试中产生延迟是绝对必须的,那么这是CountDownLatch
一个简单的解决方案。在您的测试类中声明:
private final CountDownLatch waiter = new CountDownLatch(1);
Run Code Online (Sandbox Code Playgroud)
并在需要的地方进行测试:
waiter.await(1000 * 1000, TimeUnit.NANOSECONDS); // 1ms
Run Code Online (Sandbox Code Playgroud)
也许没必要说,但请记住,您应该保持等待时间较短,不要将等待累积到太多地方。
如果您的静态代码分析器(例如SonarQube)投诉,但您无法想到另一种方法,而不是睡觉,您可以尝试使用类似的方法:
Awaitility.await().pollDelay(Durations.ONE_SECOND).until(() -> true);
在概念上不正确,但与相同Thread.sleep(1000)
。
当然,最好的方法是传递一个具有您适当条件的Callable,而不是true
我拥有的。
https://github.com/awaitility/awaitility
归档时间: |
|
查看次数: |
77340 次 |
最近记录: |