java - 使用 PowerMock 测试 Thread.sleep 不起作用
问题描述
为了简化事情,我正在尝试使用 PowerMock 在下面的方法中验证是否调用了 Thread.sleep()。
public class Sleeper {
public void sleep() throws Exception {
Thread.sleep(10);
}
}
测试班
public class SleeperTest {
// Mock setup done here to mock Sleeper instance
@Test
public void testSleep throws Exception {
PowerMockito.mockStatic(Thread.class);
sleeper.sleep();
PowerMockito.verifyStatic();
Thread.sleep(Mockito.anyLong());
}
}
我觉得这是我应该做的一切才能让它工作,但是当我尝试运行它时出现以下错误。
Wanted but not invoked java.lang.Thread.sleep(0);
Actually, there were zero interactions with this mock.
版本
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.6.2'
testCompile group: 'org.powermock', name: 'powermock-api-mockito', version: '1.6.6'
有趣的是,如果在测试方法中调用 Thread.sleep,则测试通过。
// This works
@Test
public void testSleep() throws Exception
{
PowerMockito.mockStatic(Thread.class);
Thread.sleep(Mockito.anyLong());
PowerMockito.verifyStatic();
Thread.sleep(Mockito.anyLong());
}
关于我可能做错了什么的任何想法?提前致谢。
解决方案
您是否为使用 PowerMock 运行静态模拟注释了您的测试类?你应该这样注释它:
@PrepareForTest(Sleeper.class)
@RunWith(PowerMockRunner.class)
public class SleeperTest {
// Mock setup done here to mock Sleeper instance
@Test
public void testSleep throws Exception {
PowerMockito.mockStatic(Thread.class);
sleeper.sleep();
PowerMockito.verifyStatic();
Thread.sleep(Mockito.anyLong());
}
}
请尝试使用此设置...我已尝试复制您的代码,但在 PowerMock 的兼容性和版本控制方面遇到了很多麻烦,因此放弃了。事实上,您应该避免编写需要模拟进行测试的静态方法。您应该编写它,使其不依赖于程序的状态。
推荐阅读
- powershell - PowerShell:将字符串附加到 Get-ADUser 查询的结果
- hadoop - 如何将 SQL 中的 Percentile_Disc 转换为 Spark Sql
- reactjs - React Native Web,FlatList 扩展页面
- c# - 使用 ConvertUsingEnumMapping 定义的值映射枚举时出错
- spring-mvc - 带有 Redis 和 Spring Security 的 Spring Session
- python - 如何使用缩进打印多行输出(如熊猫数据框等)
- javascript - Javascript将插入符号移动到contenteditable中的搜索字符串
- javascript - 未捕获的错误:React 中引发了跨域错误
- python-3.x - 如何使用 Python 将当前日期转换为六位儒略日期?
- python - 如何将未知数据类型保存到数据库中?