У меня есть класс с такой зависимостью:
public class Subject {
private Dependency dep;
public Subject(Dependency d) {
this.dep = d;
}
public Result test() {
return dep.validate();
}
}
Мой класс Dependency на самом деле является базовым классом. Это выглядит так:
public Class Dependency extends Base {
void method1() {
}
}
Базовый класс - это абстрактный класс, подобный этому:
public abstract class Base {
protected abstract method1() {
}
//This is the method I want to mock
public Result validate() {
}
}
Теперь я пытаюсь протестировать свой класс Subject
:
public class SubjectTest {
@Mock
private Dependency dep;
private Subject subject;
@Before
public void setup() {
initMocks(this);
subject = new Subject(dep);
}
@Test
public void test() {
when(dep.validate()).thenReturn(Result.VALID); //validate is a super class method
subject.test();
}
}
Когда я пытаюсь имитировать метод в when(dep.validate()).thenReturn(Result.VALID)
, он фактически вызывает метод настоящего суперкласса и генерирует исключение NullPointerException.
Как я могу решить эту проблему? Я знаю, что предпочтение следует отдавать композиции, а не наследованию, но я не контролирую класс Dependency. Итак, я не могу go и изменить его.
Моя команда также не поддерживает использование PowerMockito. Так что я тоже не могу это использовать.