В общем, это вопрос «как высмеивать статический метод / метод уровня класса», в котором поиск в Google показывает много разных идей, поэтому он в основном приходит на вкус.
Я считаю, что частичные макеты являются запахом кода, поскольку они показывают, что ваш тестируемый класс (CUT) не тестируется -> время на рефакторинг.
Я занимался этим двумя способами в прошлом:
1.) Передайте DateProvider (который является интерфейсом) в конструктор CUT
interface DateProvider
date timenow()
end
Во время тестирования это ваш MockDateProvider, который вы можете изменить в своем тестовом классе. Я могу использовать открытое статическое поле, которое я могу изменить в своих тестах
class MockDateProvider :: DateProvider
public static field fakeDate
date timenow ()
return fakedate
end
end
В реальной системе просто используется метод создания даты.
class RealDateProvider :: DateProvider
date timenow()
return LibraryDateMaker.newDate()
end
end
Я мог бы создать 2 конструктора, один из которых использует этот интерфейс, а другой использует RealDateProvider без каких-либо производственных классов, передающих объект.
Это предпочтительный ОО способ ведения дел. Я думаю!
2.) Создайте собственный поставщик статических дат, который можно переопределить для поведения.
Вместо LibraryDateMaker.newDate () вы создаете статический ConfigurableDateMaker.newDate (). Он использует те же объекты, что и 1, но имеет установщик, позволяющий вам при необходимости изменить поведение провайдера макета. По умолчанию реальное.
Преимущество этого в том, что вам не нужно ничего передавать в ваши конструкторы, и вы можете продолжать использовать статический метод для очень распространенного действия.
Вкратце, CUT вызывает ConfigurableDateMaker.newDate (). Который по умолчанию возвращает реальную дату, но в вашем тестовом классе вы можете настроить поведение на использование макета перед вызовом CUT.
class ConfigurableDateMaker
public static DateProvider provider
static date timenow()
return provider.newDate()
end
// add the 2 provider classes as inner classes in here
end
Надеюсь, в этом есть какой-то смысл.