Когда избегать насмешек? - PullRequest
1 голос
/ 27 июля 2011

Наиболее распространенный вариант использования насмешки -

objA uses objB;
use objA without having objB populated/initialized

так что

@Mock
private UserInterface userInterface;

public void method() {
   MockitoAnnotations.initMocks(this);
   Client client;
   client.setUserInterface(userInterface);
   when(userInterface.getSomething()).thenReturn(new OutputType("f"));
   client.doSomething();
}

Но что если нам на самом деле нужен только ВЫХОД objA? Допустим, мы не хотим вызывать objA.doSomething();, который возвращает SomeOutput, чтобы получить SomeOutput, поэтому мы могли бы

  1. макет для doSomething (), чтобы вернуть SomeOutput; - не имеет особого смысла

  2. заполнить переменную new SomeOutput(bla, bla, bla);, ничего не насмехаясь.

Я спрашиваю, потому что вижу, как программисты насмехаются над вторым способом, что практически не имеет смысла, потому что они просто создают экземпляр new SomeOutput(bla, bla, bla); и возвращают его через mocked objA;

Есть ли у него какая-то секретная цель? Я относительно новичок в насмешках.

Ответы [ 2 ]

12 голосов
/ 27 июля 2011

Насмешка хороша, когда вы хотите проверить взаимодействия между компонентами.

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

Для достаточно простых типов (обычно предоставляющих данные, а не услуги), которые уже были протестированы, просто используйте реальные типы.

См. Martin Fowler'sстатьи о издевательствах и окурках для еще большего просветления.

1 голос
/ 27 июля 2011

Не знаю, получил ли я вас, но постараюсь ответить.Целью насмешек (как вы, вероятно, уже знаете) является изоляция фрагмента кода, который вы тестируете.Один модульный тест (я предполагаю, что мы говорим о модульном тесте, когда вокруг насмехаются) должен проверять только одну вещь.В вашем примере вы можете сделать это:

 new SomeOutput(bla, bla, bla);

, даже если результат будет таким же, вы получите насмешку над объектом, в этом случае вы не изолируете класс, который хотите протестировать, потому что вы «вызываете»код зависимого компонента

В любом случае я могу предложить вам взглянуть на эту книгу

http://artofunittesting.com/

, даже если она находится в .net, концепция все та же

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