PowerMock expectNew() не издевается над конструктором, как ожидалось
Я пытаюсь изучить всевозможные издевательские библиотеки и PowerMock (в частности, расширение EasyMock), следующий на список. Я пытаюсь высмеять конструктор, и приведенные примеры не имеют такого же ответа, когда я пытаюсь их воспроизвести. Насколько я могу судить, он никогда не издевается над конструктором и просто работает так, как если бы это было нормально.
Это тестовый класс:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Writer.class})
public class FaultInjectionSituationTest {
@Test
public void testActionFail() throws Exception {
FaultInjectionSituation fis = new FaultInjectionSituation();
PowerMock.expectNew(Writer.class, "test")
.andThrow(new IOException("thrown from mock"));
PowerMock.replay(Writer.class);
System.out.println(fis.action());
PowerMock.verify(Writer.class);
}
}
Я попытался заменить "тест" на EasyMock.isA(String.class), но он дал те же результаты.
Это FaultInjectionSituation:
public class FaultInjectionSituation {
public String action(){
Writer w;
try {
w = new Writer("test");
} catch (IOException e) {
System.out.println("thrown: " + e.getMessage());
return e.getLocalizedMessage();
}
return "returned without throw";
}
}
"Писатель" - не что иное, как оболочка класса:
public class Writer {
public Writer(String s) throws IOException {
}
public Writer() throws IOException{
}
}
Когда тест запускается, он печатает "возвращенный без броска", указав, что исключение никогда не было брошено.
Ответы
Ответ 1
Вам нужно подготовить класс, который также вызывает конструктор, поэтому PowerMock знает, что ожидает вызов издевающегося конструктора. Попробуйте обновить код следующим образом:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Writer.class, FaultInjectionSituation.class})
public class FaultInjectionSituationTest {
// as before
}
Ответ 2
Сначала вы должны создать mock-объект:
Writer mockWriter = PowerMock.createMock(Writer.class)
PowerMock.expectNew(Writer.class, "test").andReturn(mockWriter)