Пробный / тестовый вызов суперкласса в подклассе ... это возможно? - PullRequest
4 голосов
/ 14 декабря 2011

Я ищу решение для насмешки над супер вызовом в подклассе ButtonClicker.

Class Click {
      public void buttonClick() throws java.lang.Exception { /* compiled code */ }     } 

Class ButtonClicker extends Click { 
    @Override
    public void buttonClick() throws Exception {

        super.buttonClick();
    } }

Ответы [ 2 ]

6 голосов
/ 14 декабря 2011

Использование наследования снижает тестируемость вашего кода.Попробуйте заменить наследование на делегирование и смоделируйте делегат.

Извлеките интерфейс IClicker

interface IClicker {
    void buttonClick();
}

Реализуйте IClicker в Clicker классе.В случае, если вы работаете со сторонним кодом, рассмотрите возможность использования Pattern Adapter

Перепишите ваш ButtonClicker следующим образом:

class ButtonClicker implements IClicker {
    Clicker delegate;

    ButtonClicker(Clicker delegate) {
        this.delegate = delegate;
    }

    @Override
    public void buttonClick() throws Exception {
        delegate.buttonClick();
    }

}

Теперь просто передайте макет какпараметр конструктора:

Clicker mock = Mockito.mock(Clicker.class);
// stubbing here
ButtonClicker buttonClicker = new ButtonClicker(mock);
3 голосов
/ 14 декабря 2011

Ответ - нет.Макет - это всего лишь тривиальная реализация интерфейса.(Я имею в виду интерфейс в смысле API, а не конкретный смысл ключевого слова Java.) Поэтому он не знает ни о каких деталях реализации, например, какой класс фактически реализует функциональность (по сути, функциональность отсутствует).

Выможет создать «шпиона» для реального объекта, который позволит вам высмеивать только некоторые методы, а не другие, но также не позволит вам высмеивать только супер-метод класса, потому что обычно выбираются методы, которые вы выбираете для имитациипо сигнатуре, которая одинакова как для подкласса, так и для суперкласса.

...