Как макет публичного или защищенного метода унаследован от суперкласса?
Код ниже показывает метод для тестирования в классе 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 может издеваться над конструктором, но я не уверен, что в этом контексте это будет возможно. Если вы хотите смоделировать определенные операторы в конструкторе, может быть лучше делегировать их новому методу, а затем смоделировать этот метод.