У нас есть задача FooTask. Мы создаем класс Foo, который имеет 1 ответственность с точки зрения бизнес-логики. Но оказывается, что FooTask действительно сложный. Он состоит из нескольких шагов/подзадач, которые затем могут быть представлены классами Bar/Baz. Эти классы не имеют реального смысла вне класса Foo, они не будут использоваться исключительно. Таким образом, у них, вероятно, будет область пакета или что-то в этом роде.Составная единица измерения
Итак, пусть ваш класс Foo, представляющий FooTask становится:
public class Foo {
private final Bar bar;
private final Baz baz;
// all-args constructor
public ReturnType doFooTask(InputParam input) {
final SubResult subresult = bar.doBarSubTask(input);
return baz.doBazSubTask(subresult);
}
}
Теперь, как бы вы проверить это? Я вижу два варианта, но не знаю, какой из них лучше:
1) классы тестов Bar и Baz через открытый API Foo. Я вижу один важный поток с таким подходом: чем больше подпроектов вы используете для создания объекта, тем больше случаев прихода.
2) Напишите полные комплекты тестов для классов Bar и Baz самостоятельно (они являются частными, поэтому я могу протестировать их без каких-либо проблем, как только я сохраню правильную иерархию тестовых пакетов).
Но что тогда? Должен ли я оставить класс Foo непроверенным? Должен ли я повторять свои тесты (это приводит к моей предыдущей проблеме - много тестовых примеров, что еще хуже, скопировать)? Или, может быть, я должен издеваться над всеми зависимостями и просто утверждать, что мой правильный метод на мой макет вызывался при вызове метода Foo?
Да, я знаю, что насмехается и когда его использовать, поверьте мне;) В любом случае - спасибо за ваш ответ. Вопрос был на самом деле: должен ли я предпочесть тестировать ингредиенты самостоятельно или через «основной» класс? – slnowak
Да, это в основном сводится к их индивидуальной сложности. Поскольку они разбиты, я буду писать тесты, которые будут охватывать их индивидуально, а затем использовать их только при необходимости для установки объекта Foo, чтобы вы могли писать тесты, которые охватывают логику в Foo. – Erik