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)