Из интервью с Кентом Беком в недавнем выпуске журнала Java:
Бинсток: давайте обсудим микросервисы. Мне кажется, что первое тестирование на микросервисах усложнилось бы в том смысле, что некоторым службам для функционирования потребуется присутствие целого ряда других служб. Ты согласен?
Бек: Кажется, что это один и тот же набор компромиссов в отношении одного большого класса или множества маленьких классов.
Бинсток: Да, за исключением того, что, я полагаю, здесь вы должны использовать очень много издевательств, чтобы иметь возможность настроить систему, с помощью которой вы можете протестировать данный сервис.
Бек: Я не согласен. Если это в императивном стиле, вы должны использовать много издевательств. В функциональном стиле, где внешние зависимости собираются вместе высоко в цепочке вызовов, тогда я не думаю, что это необходимо. Я думаю, что вы можете получить много освещения от модульных тестов.
Что он имеет в виду? Как функциональный стиль может освободить вас от насмешек над внешними зависимостями?
Ответы:
Чистая функция является тот , который:
Предположим, мы пишем некоторый код для обработки входа пользователя, где мы хотим проверить правильность введенных имени пользователя и пароля и предотвратить вход пользователя в систему, если слишком много неудачных попыток. В императивном стиле наш код может выглядеть так:
Довольно ясно, что это не чистая функция:
username
иpassword
комбинации , как результат также зависит от записи пользователя , хранящейся в базе данных.Также обратите внимание, что для модульного тестирования этой функции нам нужно смоделировать два вызова базы данных,
FindUser
иRecordFailedLoginAttempt
.Если бы мы реорганизовали этот код в более функциональный стиль, мы могли бы получить что-то вроде этого:
Обратите внимание, что хотя
UserLogin
функция все еще не является чистой,UserLoginPure
функция теперь является чистой функцией, и в результате логика аутентификации пользователя может быть проверена модульно, без необходимости имитировать какие-либо внешние зависимости. Это связано с тем, что взаимодействие с базой данных обрабатывается выше стека вызовов.источник