Как макет публичного или защищенного метода унаследован от суперкласса?

Код ниже показывает метод для тестирования в классе Sub - Поэтому я не требую издеваться над классом Sub, Однако я хотел бы высмеятьSuper класс и getSuperData метод. Есть ли способ сделать это с помощью Mockito/Powermock? Я также хотел бы знать, если есть способ издеваться над Super конструктор? Спасибо Стив

public class Super {
    private String data;
    public Super() {
    }
    public String getSuperData() {
        return data;
    }
}

public class Sub extends Super {
    Sub() {
        super();
    }
    public String methodToTest() {
        ...
        String data = getSuperData();
        ...
    }
}

public class TestSub {
    Sub sub = new Sub();
    Super superMock = Mockito.mock(Super.class);
    Mockito.when(superMock.getSuperData()).thenReturn("data");
}

1 ответ

Это возможно, но это требует от вас шпионажа за вашим объектом:

public class TestSub {
    Sub sub = Mockito.spy(Sub.class);
    Mockito.when(superMock.getSuperData()).thenReturn("data");
    sub.methodToTest();
}

Таким образом, вы высмеивали супер метод, так как шпион позволяет имитировать методы. Однако преимущество шпиона в том, что для немодированных методов он будет вызывать реальную реализацию. Следовательно sub.methodToTest() Вызов по-прежнему будет вызывать реальную реализацию.

Что касается вашего второго подвопроса, я знаю, что PowerMock может издеваться над конструктором, но я не уверен, что в этом контексте это будет возможно. Если вы хотите смоделировать определенные операторы в конструкторе, может быть лучше делегировать их новому методу, а затем смоделировать этот метод.

Другие вопросы по тегам