Подтвердить что ты не робот

Издевательство над классом и издевательством над его интерфейсом

Для unit test мне нужно высмеять несколько зависимостей. Одна из зависимостей - это класс, реализующий интерфейс:

public class DataAccessImpl implements DataAccess {
    ...
}

Мне нужно настроить макет объекта этого класса, который возвращает некоторые заданные значения при наличии определенных параметров.

Теперь, что я не уверен в том, лучше ли издеваться над интерфейсом или классом, т.е.

DataAccess client = mock(DataAccess.class);

против.

DataAccess client = mock(DataAccessImpl.class);

Есть ли разница в тестировании? Каким будет предпочтительный подход?

4b9b3361

Ответ 1

Это может не иметь особого значения в вашем случае, но предпочтительный подход заключается в том, чтобы издеваться над интерфейсом, так как обычно, если вы следуете за TDD (Test Driven Development), тогда вы можете написать свои модульные тесты еще до того, как вы напишете свои классы реализации. Таким образом, даже если у вас не было конкретного класса DataAccessImpl, вы все равно можете написать модульные тесты с помощью интерфейса DataAccess.

Кроме того, насмешливые рамки имеют ограничения в насмешливых классах, а некоторые фреймворки только портируют интерфейсы по умолчанию.

Ответ 2

Это зависит. Если ваш код зависит от класса, а не от интерфейса, вы должны издеваться над классом, чтобы написать допустимый unit test.

Ответ 3

В большинстве случаев технически нет никакой разницы, и вы можете высмеивать как класс, так что интерфейс. Концептуально лучше использовать интерфейсы из-за лучшей абстракции.

Ответ 4

Вы должны издеваться над интерфейсом, поскольку это поможет убедиться, что вы придерживаетесь принципала заместителя Лискова (fooobar.com/questions/4735/...).

Ответ 5

Если вы используете его только через интерфейс, и это не частичный макет, нет никакой разницы, кроме вашего внутреннего чувства. Издевательство над классом также высмеивает неиспользуемый публичный метод, если класс имеет их, но это не имеет большого значения для рассмотрения.