Мне удалось решить эту проблему, хотя может быть и лучшее решение, поэтому я собираюсь опубликовать свой собственный ответ, но не сразу приму его.
Мне нужно было предоставить разумноевозвращаемое значение по умолчанию для макета в форме org.mockito.stubbing.Answer<T>
с типом возврата T.
Я смог сделать это с помощью следующей настройки макета:
val defaultParseResult = new Answer[Option[MyType1]] {
def answer(p1: InvocationOnMock): Option[MyType1] = None
}
val mockParser = org.mockito.Mockito.mock(implicitly[ClassManifest[Parser]].erasure,
defaultParseResult).asInstanceOf[Parser]
посленемного поиска источника для черты org.specs2.mock.Mockito
и вещей, которые он вызывает.
И теперь, вместо возврата null, анализ возвращает None
, когда он не задан (в том числе, когда ожидается, как в первомtest), который позволяет пройти тест с использованием этого значения в тестируемом коде.
Я, скорее всего, создам метод поддержки тестирования, скрывающий беспорядок в назначении mockParser
, и позволяющий мне делать то же самоедля различных типов возврата, поскольку мне понадобится одна и та же возможность с несколькими типами возврата только в этом наборе тестов.
Я не смог найти поддержку для более короткого способа сделать это в org.specs2.mock.Mockito
,новозможно, это вдохновит Эрика добавить такое.Приятно иметь автора в разговоре ...
Редактировать
При дальнейшем изучении источника мне пришло в голову, что я должен иметь возможность просто вызвать метод
def mock[T, A](implicit m: ClassManifest[T], a: org.mockito.stubbing.Answer[A]): T = org.mockito.Mockito.mock(implicitly[ClassManifest[T]].erasure, a).asInstanceOf[T]
определено в org.specs2.mock.MockitoMocker
, что на самом деле послужило вдохновением для моего решения выше.Но я не могу понять звонок.mock
довольно перегружен, и все мои попытки, похоже, заканчиваются вызовом другой версии и не нравятся мои параметры.
Так что, похоже, Эрик уже включил поддержку для этого, ноЯ не понимаю, как к нему добраться.
Обновление
Я определил черту, содержащую следующее:
def mock[T, A](implicit m: ClassManifest[T], default: A): T = {
org.mockito.Mockito.mock(
implicitly[ClassManifest[T]].erasure,
new Answer[A] {
def answer(p1: InvocationOnMock): A = default
}).asInstanceOf[T]
}
и сейчасиспользуя эту черту, я могу настроить мой макет как
implicit val defaultParseResult = None
val mockParser = mock[Parser,Option[MyType1]]
Мне больше не нужно больше использовать это в этом конкретном тесте, так как предоставление полезного значения для этого делает все мои тесты работающими без нулевых проверокв тестируемом коде.Но это может понадобиться в других тестах.
Мне все еще было бы интересно узнать, как решить эту проблему без добавления этой черты.