Хорошо, я очень новичок в Scala. На работе меня назначили в проект, который использует Scala, и я работаю с ним в меру своих возможностей.
Так что одна из вещей, которые я только что сделал, - это изменить функцию на PartialFunction, чтобы он мог обрабатывать несколько типов аргументов. Вот подпись функции:
// InputService.scala
@throws[FileNotFoundException]
def open: PartialFunction[Any, Unit] = {
case file: File =>
source = Source.fromFile(file)
case apiContext: ApiContext =>
source = Source.fromInputStream(IOUtils.toInputStream(apiContext.request.payload, apiContext.request.encoding))
}
Итак, у меня есть метод, который пытается использовать эту функцию open (). Вот код для этого:
// FileHandler.scala
def processFile(file: File, process: ProcessDefinition): Unit = {
process.input.open(file) // NPE happens here during Unit Test
}
В тесте используется MockitoSugar для насмешки над всеми этими объектами. Вот установочный код, который строит все.
// FileHandlerTest.scala
val processDefinitionMock: ProcessDefinition = mock[ProcessDefinition]
val inputServiceMock: InputService = mock[InputService]
when(processDefinitionMock.input).thenReturn(inputServiceMock)
Так что, на мой Java тренированный глаз, корректный код корректен. Я добавил в код некоторые операторы println () и подтвердил, что в этом разделе кода нет нулевых значений, бросающих NPE. Я чувствую, что это как-то связано с PartialFunctions и Mockito, но я не понимаю, что это может быть. и тогда все заработало:
// InputService.scala
@throws[FileNotFoundException]
def open(arg: Any): Unit = {
arg match {
case file: File =>
source = Source.fromFile(file)
case apiContext: ApiContext =>
source = Source.fromInputStream(IOUtils.toInputStream(apiContext.request.payload, apiContext.request.encoding))
}
}
Я бы предпочел придерживаться оригинального дизайна PartialFunction, поэтому помощь будет принята с благодарностью. Спасибо.