Рассмотрим следующий пример класса Scala и модульного теста:
class BrokenClass(s: String) {
private val len = s.length
def length(): Int = len
}
class BrokenTest extends FlatSpec with Matchers with MockFactory {
"A BrokenClass" should "stub correctly" in {
val stubThing = stub[BrokenClass]
(stubThing.length _) when () returns (10)
stubThing.length should equal (10)
}
}
В более старых версиях ScalaMock этот код будет работать. В Scala 2.12 и ScalaMock 3.6 я получаю исключение NullPointerException, потому что, хотя я создаю заглушку, она по-прежнему вызывает строку «s.length» конструктора BrokenClass. Итак, он пытается разыменовать "s", который равен нулю, потому что я ничего ему не передал, потому что все, что мне нужно, это заглушка, которая возвращает определенное значение при вызове определенного метода.
Есть ли способ создать заглушку, не пытаясь вызвать конструктор объекта? Почему это работало в старых версиях?