[英]How to mock Thread.sleep() with PowerMock?
如何使用 PowerMock 模拟 Thread.sleep()?
示例接口和class:
public interface Machine {
void sleep(long millis);
}
public class MachineImpl
implements Machine {
private static final Logger logger = Logger.getLogger(MachineImpl.class);
@Override
public void sleep(long millis) {
try {
if (millis > 0) {
logger.trace(String.format("Try to sleep for %d millis...", millis));
Thread.sleep(millis);
}
}
catch (InterruptedException e) {
logger.trace("Full exception", e);
}
}
}
这花了我一段时间才弄明白,所以我正在回答我自己的问题。
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class) // important
@PrepareForTest(MachineImpl.class) // important: do not use Thread.class here
public class MachineImplTest {
private MachineImpl classUnderTest;
@Before
public void beforeEachTest() {
classUnderTest = new MachineImpl();
}
@Test
public void sleep_Pass() {
classUnderTest.sleep(0);
classUnderTest.sleep(-100);
classUnderTest.sleep(+100);
}
@Test
public void sleep_Pass2() {
// We do not want to mock all methods, only specific methods, such as Thread.sleep().
// Use spy() instead of mockStatic().
PowerMockito.spy(Thread.class);
// These two lines are tightly bound.
PowerMockito.doThrow(new InterruptedException()).when(Thread.class);
Thread.sleep(Mockito.anyLong());
classUnderTest.sleep(0);
classUnderTest.sleep(-100);
classUnderTest.sleep(+100);
}
}
如果您使用的是 TestNG,请尝试以下操作:
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
@PrepareForTest(MachineImpl.class) // important: do not use Thread.class here
public class MachineImplTest
extends PowerMockTestCase {
...
}
在此处阅读有关 TestNG + Mockito + PowerMock 的更多信息: https ://stackoverflow.com/a/35815153/257299
这很有帮助。 我确实最终使用了一些稍微不同的东西。 我使用 EasyMock 而不是 Mockito。
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassUnderTest.class})
public class MyTest {
@Before
public void setUp() {
PowerMock.mockStatic(Thread.class, methods(Thread.class, "sleep"));
Thread.sleep(anyLong());
EasyMock.expectLastCall().anyTimes();
}
}
无需在@PrepareForTest
使用Thread.class
。
在不使用 Power Mockito 的情况下,为 Thread.sleep(anyLongValue) 编写包装方法并将其移动到实用程序 class 并使用常规 Mockito API 模拟实用程序 class 方法。
public void sleep(int duration) throws InterruptedException {
Thread.sleep(duration);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.