Я пытаюсь протестировать код Scala, используя Specs2 и Mockito. Я относительно новичок во всех трех, и у меня возникают трудности с издевательством над методами, возвращающими нуль.
Далее (переписано с некоторыми изменениями имени)
"My Component's process(File)" should {
"pass file to Parser" in new modules {
val file = mock[File]
myComponent.process(file)
there was one(mockParser).parse(file)
}
"pass parse result to Translator" in new modules {
val file = mock[File]
val myType1 = mock[MyType1]
mockParser.parse(file) returns (Some(myType1))
myComponent.process(file)
there was one(mockTranslator).translate(myType1)
}
}
«Передать файл парсеру» работает до тех пор, пока я не добавлю вызов транслятора в SUT, а затем умирает, потому что метод mockParser.parse
вернул нуль, который код транслятора не может принять.
Точно так же «передать результат синтаксического анализа переводчику» проходит до тех пор, пока я не попытаюсь использовать результат перевода в SUT.
Реальный код для обоих этих методов никогда не может возвращать значение null, но я не знаю, как сказать Mockito, чтобы ожидания возвращали пригодные для использования результаты.
Я, конечно, могу обойти это, поместив проверки нулей в SUT, но я бы предпочел этого не делать, так как я никогда не возвращаю нули и вместо этого использую Option
, None
и Some
.
Указатели на хороший учебник Scala/Specs2/Mockito были бы замечательными, как и простой пример того, как изменить строку, например
there was one(mockParser).parse(file)
чтобы заставить его возвращать что-то, что позволяет продолжить выполнение в SUT, когда он не имеет дело с нулями.
Пытаясь понять это, я попытался изменить эту строку на
there was one(mockParser).parse(file) returns myResult
со значением для myResult того типа, который я хочу вернуть. Это дало мне ошибку компиляции, поскольку она ожидает найти там MatchResult
, а не мой возвращаемый тип.
Если это имеет значение, я использую Scala 2.9.0.