Издеваться над кейсом для тестирования - PullRequest
0 голосов
/ 20 мая 2019

У меня есть класс дел

case class InputCriteria(a: Int) {
   val b: Int = config.getInt("some path")
}

Как смоделировать этот класс дел и переопределить значение b?

Ответы [ 2 ]

4 голосов
/ 20 мая 2019

Из скаляпа часто задаваемые вопросы :

Могу ли я издеваться над 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 .

2 голосов
/ 20 мая 2019

попробуйте это:

object abc extends App {
  case class A() {
    val x = 6
  }

  val a: A = new A() {
    override val x = 9
  }

  println(A().x, a.x)
}
...