Откройте геттер в Kotlin, чтобы использовать его с Mockito - MissingMethodInvocationException - PullRequest
0 голосов
/ 07 сентября 2018

Kotlin может автоматически создавать геттеры для параметров основного конструктора (это здорово), и все эти геттеры являются окончательными (не открытыми) по умолчанию. У меня есть класс (в Котлине):

open class SongCategory(val id: Long,
                        val type: SongCategoryType,
                        val name: String? = null,
                        var displayName: String? = null,
                        var songs: List<Song>? = null) {
}

Я хотел использовать его в каком-нибудь тесте Mockito (на Java):

SongCategory songCategory = mock(SongCategory.class);
// the line below produces MissingMethodInvocationException
when(songCategory.getDisplayName()).thenReturn("Dupa");

Это приводит к MissingMethodInvocationException, потому что Mockito нуждается в том, чтобы смоделированный класс был открыт (не окончательный), а смоделированный метод getDisplayName() просто должен быть открыт, но это не так.

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

Я мог бы переместить все эти параметры во вторичный конструктор и создать все свойства и геттеры по отдельности. Однако, если мне нужно написать тот же шаблонный код, что и в Java, тогда какой смысл использовать Kotlin?

Есть ли какой-нибудь способ использовать Mockito с компиляторами, скомпилированными в Kotlin?

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Я согласен с @Unknown, что есть места, где вы можете использовать плагин kotlin-allopen. Но в этом случае, поскольку все, что вы пытаетесь сделать, - это смоделировать класс Kotlin (он не открыт), вам просто нужно добавить плагин mockito-inline.

Добавьте ниже к вашему build.gradle:

testImplementation 'org.mockito:mockito-core:2.13.0' // use the latest version
testImplementation 'org.mockito:mockito-inline:2.13.0'
0 голосов
/ 07 сентября 2018

Вы можете попробовать использовать PowerMock , чтобы справиться с окончательным методом

или альтернативно Джавасист и его javassist.Modifier

0 голосов
/ 07 сентября 2018

На самом деле я обнаружил, что синтаксис для открытия геттера довольно прост (хотя его нет в официальной документации):

open class SongCategory(...
                        open var displayName: String? = null,
                        ...) {
}

Это открывает и метод получения, и метод установки для свойства.

0 голосов
/ 07 сентября 2018

Не open ваш класс только для тестирования.Вместо этого попробуйте использовать плагин компилятора, чтобы сделать это для вас.Вы можете прочитать об этом здесь: https://kotlinlang.org/docs/reference/compiler-plugins.html#all-open-compiler-plugin

После этого вы сможете использовать Mockito как любой другой класс Java.

...