Scala Testing: заменить реализацию функции
Используя ScalaTest, я хочу заменить реализацию функции в тестовом примере. Мой вариант использования:
object Module {
private def currentYear() = DateTime.now().year.get
def doSomething(): Unit = {
val year = currentYear()
// do something with the year
}
}
Я хочу написать тестовый модуль Module.doSomething
, но я не хочу, чтобы этот тестовый пример зависел от фактического года проведения теста.
В динамических языках я часто использовал конструкцию, которая может заменить реализацию функции для возврата фиксированного значения.
Я хотел бы, чтобы мой тестовый пример изменил реализацию Module.currentYear
всегда возвращать 2014 год, независимо от того, какой фактический год.
Я нашел несколько ложных библиотек (Mockito, ScalaMock, ...), но все они могли только создавать новые ложные объекты. Ни один из них, казалось, не смог заменить реализацию метода.
Есть способ сделать это? Если нет, то как я могу тестировать подобный код, не завися от года, в котором выполняется тест?
2 ответа
Одним из способов было бы просто сделать do_something_with_the_year
доступно для вашего теста (например, сделайте его защищенным). Это также хорошо, потому что он разделяет поиск зависимостей и фактически их использование.
Другим способом было бы поместить вашу логику в черту, сделать currentYear
метод защищен, и пусть объект будет экземпляром этой черты. Таким образом, вы можете просто создать собственный объект из его свойств в тесте, и вам не понадобится фиктивная библиотека.
ScalaMock может макетировать одноэлементные объекты, которые он говорит прямо здесь: http://paulbutcher.com/2011/11/06/scalamock-step-by-step/
Помимо свойств (интерфейсов) и функций, он также может издеваться над:
Классы
Синглтон и сопутствующие объекты (статические методы) ...