gpt4 book ai didi

java - 如何使用 PowerMock 模拟 Thread.sleep()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:34:33 25 4
gpt4 key购买 nike

如何使用 PowerMock 模拟 Thread.sleep()?

示例接口(interface)和类:

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

关于java - 如何使用 PowerMock 模拟 Thread.sleep()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19494506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com