Int) = v * v
А есть функция, которая возвращает площадь круга:
def circle(r: Int) = 3.1415 * pow(r)
Видим, что circle использует pow. А у нас "юнит" тестирование. Как решать?
1) Делаем интеграционный тест?
2) Просим, чтобы в аргумент передавали сразу квадрат числа?
3) Просим, чтобы передавали функцию возведения в квадрат в аргумент?
4) Мутим имплисит, который подставляет функцию возведения в квадрат по умолчанию, который мы можем перегрузить, как если бы это было простым каррированием?
Пример специально упрощён. Общий смысл, что есть простые и хорошие функции типа pow, а есть комплексные типа circle.
Имхо. 1 - почему нет? если, конечно, скоуп теста не слишком размывается из-за сложности, внешних зависимостей и т.п. 2 - мне не нравится, т.к. где-то вызов pow все равно придется делать и этот код тестировать 3 - хорошо для приватных методов, в публичных интерфейсах быстро превращается в лапшу 4 - есть люди, которые так делают. для сложных случаев, где имеют смысл моки, я бы вообще сделал так: class Cirle(pow: PowInterface) { def circle(r: Int) = .... }
есть ОЧЕНЬ крутая статья на эту тему: https://habr.com/ru/post/331130/
Обсуждают сегодня