Mockito Mocks ведет себя как шпионы: Котлин

Я работаю над котлинским банком, в котором я пытаюсь высмеять ввод функции

class MyService fun serviceFunction(input: ClassFromAnotherLibrary): Output { val foo = input.memberFunction() 

Так получилось, что memberFunction был добавлен в этот класс в моем пакете через функцию расширения на уровне пакета

 fun ClassFromAnotherLibrary.memberFunction() : Foo { val mapper = jacksonObjectMapper() return mapper.readValue(this.serializedFoo, Foo::class.java) } 

Теперь я хочу написать тест для функции serviceFunction , но я хочу издеваться memberFunction вызовом memberFunction (для этого у меня есть отдельные тесты).

Поэтому в моем тесте Mockito JUnit я делаю следующее

 val service = Service() val mockClassFromAnotherLibrary = mock<ClassFromAnotherLibrary>() val mockFoo = mock<Foo>() whenever(mockClassFromAnotherLibrary.memberFunction()) .thenReturn(mockFoo) service.serviceFunction(mockClassFromAnotherLibrary) , val service = Service() val mockClassFromAnotherLibrary = mock<ClassFromAnotherLibrary>() val mockFoo = mock<Foo>() whenever(mockClassFromAnotherLibrary.memberFunction()) .thenReturn(mockFoo) service.serviceFunction(mockClassFromAnotherLibrary) 

Я ожидал бы, что фактическая реализация memberFunction никогда не будет вызвана, и что мой макет перехватит любые попытки вызвать его и вместо этого вернет мой mockFoo .

То, что на самом деле происходит, – это whenever настройка для извлечения метода вызывает базовую функцию , вызывая NullPointerException когда программа- mapper пытается прочитать serializedFoo (что, конечно, null).

Мой вопрос: почему на самом деле memberFunction реальная memberFunction ? Я новичок в Mockito и Kotlin, но в прошлом использовал тесты Jasmine (для JS) и Spock (для Groovy / Java), и издевательство над объектом в обеих этих фреймах никогда не исполнило бы какую-либо изнашиваемую функцию ( что я знаю).

Мне удалось обойти проблемы, подобные этому в прошлом, создав ClassFromAnotherLibrary в ClassFromAnotherLibrary я пытаюсь ClassFromAnotherLibrary interface который я ClassFromAnotherLibrary над этим, но это

  1. Чувствует себя взломанным и
  2. Это не вариант в этом случае (это не мой класс для редактирования, он исходит из другой библиотеки)

Для справки, это соответствующие зависимости градиента, которые использует мой проект:

 compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.8.9" compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.9" compile "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.9" testCompile 'junit:junit:4.12' testCompile "org.jetbrains.kotlin:kotlin-test:1.1.4-3" testCompile "org.jetbrains.kotlin:kotlin-test-junit:1.1.4-3" testCompile "com.nhaarman:mockito-kotlin:1.3.0" testCompile "org.mockito:mockito-inline:2.8.47" 

Я также установил файл MockMaker в своей папке test/resources чтобы включить mock-maker-inline , хотя я не совсем понимаю, что это может сделать (см. Подсказку об этом здесь )

Благодаря любому Kotlin / Mockito

Функции расширения – это не что иное, как обычный статический метод Java, и, насколько я помню, Mockito не может издеваться над статическими методами.