Модульный тест: макет вложенного scala val - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть два класса дел A и AHelper

case class AHelper(data: String) {
  def getData() = {...} // Complex operation inside
}

case class A(data1: String, data2: String) {
  private val aHelper = AHelper(data2)    // AHelper instance
  def getData() = {data1 + aHelper.getData; ...} // Complex operation inside
}

класс A имеет экземпляр AHelper в качестве одного из его членов.

Я хочу написать модульные тесты только для A , насмешливый AHelper

Версия Scala: 2.11

1 Ответ

4 голосов
/ 05 апреля 2019

Помощник должен быть параметром:

case class A(data1: String, data2: String)(aHelper: AHelper = AHelper(data2))

Теперь в ваших тестах вы можете сделать: A("foo", "bar")(mock[AHelper])

Если вам не нравится второй список параметров, естьнесколько вариантов:

Сделать это неявным:

case class A(data1: String, data2: String)(implicit aHelper: AHelper = AHelper(data2))

Это позволяет создавать экземпляры всего с new A("foo", "bar") без необходимости вставлять () в конец

Или создайте сопутствующий объект:

 object A {
   def apply(data1: String, data2: String): A = A(data1, data2)(AHelper(data2))
 }

Также отметьте , что классы дел с задействованной логикой, которые требуют модульных тестов, ... необычны.Класс Case предназначен для того, чтобы просто хранить данные, кортеж с именованными полями, если хотите.Вам следует подумать о том, чтобы либо разделить свою логику на эти классы, либо вместо этого сделать их «обычными» (не-регистровыми) классами.

Например:

case class A1(data: String)
case class A2(data1: String, data2: A1)

trait AHelper {
  def getData(a1: A1)
}

class  AReader(helper: AHelper) {
  def getData(a: A2) = a.data1 + helper.getData(a.data2))
}

Теперь вопросов неткак правильно это проверить, верно?

...