Мне не удается найти решение моих проблем с JUnit, поэтому я попытался максимально упростить это, поэтому я надеюсь, что это будет легко понять.
По сути, я пытаюсь проверить этокласс:
public class PB {
public int startProcessBuilder() {
int status = 1;
try {
ProcessBuilder pb = new ProcessBuilder("java", "-jar", ".....");
pb.directory(new File("/directory"));
Process process = pb.start();
status = process.waitFor();
} catch (IOException | InterruptedException e) {
System.out.println(e.getMessage());
}
return status;
}
}
Итак, я придумал этот тест:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ ProcessBuilder.class, PB.class })
public class PBTest {
private PB spyInstance = Mockito.spy(PB.class);
private ProcessBuilder processBuilderMock = PowerMockito.mock(ProcessBuilder.class);
private Process processMock = Mockito.mock(Process.class);
@Before
public void initialize() throws Exception {
PowerMockito.whenNew(ProcessBuilder.class).withParameterTypes(String[].class).withArguments(anyVararg())
.thenReturn(processBuilderMock);
PowerMockito.doReturn(processMock).when(processBuilderMock).start();
}
@Test
public void testStartProcessBuilder() throws Exception {
assertThat(spyInstance.startProcessBuilder(), is(0));
}
}
Я знаю, что мой тест проходит успешно, но в компании, в которой я работаю, мы используем jacoco иeclemma для отображения покрытия кода. Известно, что весь код отображается как покрытие 0%, если класс, который мы тестируем, содержится в аннотации @PrepareForTest.
Итак, существует известное решение, которым мы сейчас занимаемсяиспользуя некоторое время, используя MockitoJUnitRunner (http://www.notonlyanecmplace.com/make-eclemma-test-coverage-work-with-powermock/)
@RunWith(MockitoJUnitRunner.class)
@PrepareForTest({ ProcessBuilder.class, PB.class })
public class PBTest {
private PB spyInstance = Mockito.spy(PB.class);
private ProcessBuilder processBuilderMock = PowerMockito.mock(ProcessBuilder.class);
private Process processMock = Mockito.mock(Process.class);
@Rule
public PowerMockRule rule = new PowerMockRule();
static {
PowerMockAgent.initializeIfNeeded();
}
@Before
public void initialize() throws Exception {
PowerMockito.whenNew(ProcessBuilder.class).withParameterTypes(String[].class).withArguments(anyVararg())
.thenReturn(processBuilderMock);
PowerMockito.doReturn(processMock).when(processBuilderMock).start();
}
@Test
public void testStartProcessBuilder() throws Exception {
assertThat(spyInstance.startProcessBuilder(), is(0));
}
}
Теперь возникают реальные проблемы: когда я пытаюсь запустить свой тест, появляется это исключение: org.mockito.exceptions.misusing.NotAMockException:Аргумент передается, когда () не является ложным!NES
private ProcessBuilder processBuilderMock = PowerMockito.mock(ProcessBuilder.class);
PowerMockito.doReturn(processMock).when(processBuilderMock).start();
этим:
private ProcessBuilder processBuilderMock = Mockito.mock(ProcessBuilder.class);
PowerMockito.doReturn(processMock).when(processBuilderMock).start();
но затем, конечно: Cannot mock/spy class java.lang.ProcessBuilder... because it is a final class
(вероятно, почему я использовал PowerMock в первую очередь)
Что такоемои варианты?