Дразнить класс против дразнить его интерфейс - PullRequest
40 голосов
/ 10 февраля 2012

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

public class DataAccessImpl implements DataAccess {
    ...
}

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

DataAccess client = mock(DataAccess.class);

против.

DataAccess client = mock(DataAccessImpl.class);

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

Ответы [ 5 ]

45 голосов
/ 10 февраля 2012

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

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

6 голосов
/ 10 февраля 2012

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

6 голосов
/ 10 февраля 2012

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

3 голосов
/ 26 мая 2014

Вам следует смоделировать интерфейс, так как он поможет вам придерживаться принципа подстановки Лискова (https://stackoverflow.com/a/56904/3571100).

2 голосов
/ 10 февраля 2012

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

...