У меня есть класс дела
case class InputCriteria(a: Int) {
val b: Int = config.getInt("some path")
}
Как издеваться над этим классом case и переопределить значение b?
У меня есть класс дела
case class InputCriteria(a: Int) {
val b: Int = config.getInt("some path")
}
Как издеваться над этим классом case и переопределить значение b?
Из faq scalamock:
Могу ли я издеваться над валом/ленивым валом?
Нет, компилятор Scala не позволит переопределить val с помощью def, поэтому со ScalaMock это невозможно. Вариант, который мы рассматриваем для возможной будущей версии ScalaMock, — это scala.meta, но он еще не доступен для всех целей сборки, которые мы хотим. Если вы можете, лучше создать черту с дефом и вместо этого смоделировать ее. Конкретная реализация все еще может переопределить это определение с помощью val, чтобы обеспечить неизменное поведение.
Если вы измените свой класс case на 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)
Подход интерфейс + реализация дает вам возможность легко протестировать свой код. Вы также можете решить в реализации класса, должны ли ваши свойства быть defs, vals или lazy vals.
попробуй это:
object abc extends App {
case class A() {
val x = 6
}
val a: A = new A() {
override val x = 9
}
println(A().x, a.x)
}