在Kotlin中打开getter使其与Mockito结合使用-MissingMethodInvocationException

时间:2018-09-06 23:14:35

标签: java kotlin mockito getter

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()仅必须打开,但不是。

我无法打开此getter或创建另一个覆盖的getter,因为它与为构造函数自动创建的最终getter冲突。

我可以将所有这些参数移至辅助构造函数,并分别创建所有属性和获取器。但是,如果我必须编写与Java中相同的样板代码,那么使用Kotlin有什么意义呢?

有没有办法将Mockito与Kotlin编译的吸气剂一起使用?

4 个答案:

答案 0 :(得分:3)

不要仅仅为了测试而open您的课程。而是尝试使用编译器插件为您执行此操作。您可以在这里阅读有关内容:https://kotlinlang.org/docs/reference/compiler-plugins.html#all-open-compiler-plugin

完成后,您就可以将Mockito用作任何其他Java类。

答案 1 :(得分:1)

您可以尝试使用PowerMock处理最终方法

或者Javasist及其api/posts?from=1&to=10

答案 2 :(得分:1)

我同意@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'

答案 3 :(得分:0)

实际上,我发现打开吸气剂的语法非常简单(尽管官方文档中没有):

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

这将同时打开属性的获取器和设置器。