有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java测试线程。在PowerMock不工作的情况下睡觉

为了简化事情,我尝试验证这个线程。在下面的方法中使用PowerMock调用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'

有趣的是,如果线程。在测试通过的测试方法中调用sleep

// This works
@Test
public void testSleep() throws Exception
{
  PowerMockito.mockStatic(Thread.class);
  Thread.sleep(Mockito.anyLong());
  PowerMockito.verifyStatic();
  Thread.sleep(Mockito.anyLong());
}

你知道我可能做错了什么吗?提前谢谢


共 (1) 个答案

  1. # 1 楼答案

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