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编译的吸气剂一起使用?
答案 0 :(得分:3)
不要仅仅为了测试而open
您的课程。而是尝试使用编译器插件为您执行此操作。您可以在这里阅读有关内容:https://kotlinlang.org/docs/reference/compiler-plugins.html#all-open-compiler-plugin
完成后,您就可以将Mockito用作任何其他Java类。
答案 1 :(得分:1)
答案 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,
...) {
}
这将同时打开属性的获取器和设置器。