Ложный вызов супер метод - защищен - PullRequest
0 голосов
/ 02 мая 2018

Моя проблема в том, что я хочу протестировать класс B с помощью насмешливого метода супер-вызова, потому что мне не нужно тестировать там super.doSomething ().

public class A{
    protected void doSomething(){
        //some Code
    }
}

public class B extends A{
    @Override
    protected void doSomething(){
        //some Code
        super.doSomething();
    }
}

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

С чего бы вам вообще захотеть это сделать?

Гарантия, которую он дает вам: B.doSomething () ведет себя правильно, при условии, что A.doSomething () никогда не изменяется, и при условии, что A навсегда остается суперклассом B .

Ваша цель - запечатать реализацию A и B? Цель юнит-тестирования обычно противоположна - стимулировать рефакторинг. В вашем случае:

  • если кто-то изменяет A.doSomething() с треском, ваш тест все равно будет проходить ( ложное срабатывание )
  • если кто-то извлечет только одну строку кода из B.doSomething() до A.doSomething() (что не исключено, учитывая, что они уже ориентированы на повторное использование кода), тест, скорее всего, не пройдёт ( false отрицательный )
0 голосов
/ 02 мая 2018

Это невозможно.

Попробуйте использовать композицию вместо наследования , чтобы ваши тесты работали.

Я имею в виду, если возможно, сделать что-то вроде:

public class B extends A{

    //notice the composition of class A into class B

    private A a;
    ........

    @Override
    protected void doSomething(){
        //some Code
        a.doSomething();
    }
    ......
}

Здесь вы можете легко смоделировать a в ваших тестах.

Если это не выбор, тогда вам придется высмеивать все внутри метода super.doSomething(). И powermockito тоже может пригодиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...