У меня есть следующий класс, который я пытаюсь проверить:Игнорировать метод родительского класса в модульном тестировании с Mockito
public class ClassA extends ClassB {
...
public String methodToBeTested(){
methodA1();
methodB();
return something;
}
...
}
methodB
является метод родительского класса. Я хочу игнорировать этот метод или просто его заглушить. Я пытаюсь следующий более и менее:
public class TestClassA{
@Mock
ClassB instanceB;
public String testTheMethodToBeTested{
doNothing().when(instanceB).methodB();
ClassA instanceA = new ClassA();
String result = instanceA.methodToBeTested();
String expected = "foo"
assertTrue(result.equals(expected));
}
...
}
Однако я вижу, что methodB
все еще выполняется. Однако в ClassA
, если я объявляю переменную classB и ее setter; и вместо methodB()
напишите classB.methodB()
мои тесты выполняются. Но меня просят не менять тестируемый код. Есть ли способ проверить ClassA
?
Итак, вы создаете макет 'ClassB', а затем экземпляр класса ClassA ... почему вы ожидаете, что макет' ClassB' имеет отношение к вашему экземпляру 'ClassA'? Просто создайте шпион для 'ClassA' и при использовании' doNothing(). When (instanceA) .methodB(); '. – Tom
Я очень новичок в модульном тестировании и Java, поэтому я не ожидал ничего, кроме чуда из-за отчаяния. Я попробую то, что вы рекомендовали. Огромное спасибо. – newzad
Подсказка: ваш код является хорошим примером, почему многие люди утверждают, что вам следует предпочесть композицию над наследованием. Если ваш класс A содержит B (вместо его расширения), вы можете использовать инъекцию зависимостей и вставлять в B тестовый объект B в A ... и вам не нужно будет попадать в Spy-бизнес. Я не говорю, что ваш дизайн по своей сути ошибочен; но, вероятно, стоит рассмотреть его со своими сверстниками. – GhostCat