首页 > 解决方案 > 使用 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());
}

关于我可能做错了什么的任何想法?提前致谢。

标签: javamockitopowermockito

解决方案


您是否为使用 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 的兼容性和版本控制方面遇到了很多麻烦,因此放弃了。事实上,您应该避免编写需要模拟进行测试的静态方法。您应该编写它,使其不依赖于程序的状态。


推荐阅读