Scala: насмешка над объектом методом PartialFunction вызывает исключение NullPointerException - PullRequest
0 голосов
/ 27 марта 2020

Хорошо, я очень новичок в 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, поэтому помощь будет принята с благодарностью. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...