Из скаляпа часто задаваемые вопросы :
Могу ли я издеваться над val / lazy val?
Нет, компилятор Scala не позволяет переопределять val с помощью def, поэтому в ScalaMock это невозможно. Опция, которую мы ищем для возможной будущей версии ScalaMock, - это scala.meta, но она еще не доступна для всех целей сборки, которые мы хотим. Если вы можете, лучше придумать черту с определением и вместо этого посмеяться над ней. Конкретная реализация все еще может переопределить эту def с помощью val, чтобы дать инвариантное поведение.
Если вы измените свой класс дел на trait
, вы сможете переопределить val
с помощью proxy.MockFactory .
Если бы вы изменили val
на def
, вы могли бы переопределить с простым насмешкой.
Вы также можете использовать подход из ответа Рамана, поэтому, если вы не хотите, чтобы ваш класс final
это рабочее решение.
Но, на мой взгляд, вы должны просто создать черту:
trait InputCriteria {
def b: Int
}
и затем реализовать его:
case class ConfigDrivenInputCriteria(config: Config) extends InputCriteria {
override val b: Int = config.getInt("some path")
}
Тогда в тесте вы можете просто переопределить его:
val testInputCritria = new InputCriteria {
override def b: Int = 4
}
но это может быть немного неуклюжим, если у вас есть много полей в InputCriteria , но в этом случае вы также можете посмеяться над ним:
val inputCriteria = stub[InputCriteria]
(inputCriteria.b _).when().returns(100)
Интерфейс + подход к реализации дает вам возможность легко тестировать ваш код. Вы также можете решить в классе реализации, должны ли ваши свойства быть def , vals или lazy vals .