【发布时间】:2017-03-06 06:54:02
【问题描述】:
我在模拟 ProcessBuilder 的构造函数时遇到了问题。 ProcessBuilder 对象未被模拟,而是 new 返回 null。代码:
import java.util.concurrent.Executors;
public class Runner {
private ProcessBuilder processBuilder;
public ProcessBuilder getProcessBuilder() {
return processBuilder;
}
public void run() {
processBuilder = new ProcessBuilder("command", "parameter");
}
public void runInSubclass() {
final SubRunner subRunner = new SubRunner();
subRunner.run();
}
public void runInThread() {
Executors.newSingleThreadExecutor().execute(new SubRunner());
}
private class SubRunner extends Thread {
public void run() {
processBuilder = new ProcessBuilder("command", "parameter");
}
}
}
测试(全部失败):
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.whenNew;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Runner.class)
public class RunnerTest {
private Runner runner;
@Before
public void setUp() throws Exception {
runner = new Runner();
ProcessBuilder processBuilderMock = mock(ProcessBuilder.class);
whenNew(ProcessBuilder.class).withAnyArguments().thenReturn(processBuilderMock);
}
@Test
public void run() throws Exception {
runner.run();
assertThat(runner.getProcessBuilder(), is(not(nullValue())));
}
@Test
public void runInSubclass() throws Exception {
runner.runInSubclass();
assertThat(runner.getProcessBuilder(), is(not(nullValue())));
}
@Test
public void runInThread() throws Exception {
runner.runInThread();
Thread.sleep(100);
assertThat(runner.getProcessBuilder(), is(not(nullValue())));
}
}
我正在使用最新的 PowerMock (1.6.6)。
【问题讨论】:
-
I've got problems ...请解释到底发生了什么以及为什么会出现问题 -
@defaultlocale,已更新。 new 返回 null 并且所有测试都失败。
标签: java testing junit powermock processbuilder