ScalaMock: издевательство над трейтом с инициализацией через lazy val

У меня есть следующая черта, которую я хочу высмеять:

trait TraitA extends TraitB {
   private lazy val internalObject = new ServiceA()
   internalObject.setSomeVal("someVal")
   internalObject.setSomeOtherval("someOtherVal")
   private lazy val anotherObject = new ServiceB()

   def functionA(paramA: typeB): typeC = {
       // some code using internalObject & anotherObject
   } 
}

При использовании ScalaMock я пытаюсь сделать

val mockTraitA = mock[TraitA]

он терпит неудачу с java.lang.NullPointerException, поскольку, вероятно, он не может правильно инициализировать фиктивную версию этого признака из-за наличия приватных lazy val?

Каким может быть правильный способ инициализации такой черты?


person Agraj    schedule 03.11.2017    source источник


Ответы (1)


Для mockTraitA строка internalObject.setSomeVal... будет выполняться при запуске конструктора типажа. Нет никакого способа предотвратить это, к сожалению.

Если вы можете, попробуйте реорганизовать это:

private lazy val internalObject = {
  val t = new ServiceA
  t.setSomeVal("someVal")
  t.setSomeOtherval("someOtherVal")
  t
}
person Philipp    schedule 04.11.2017