Kapt generatestubs – 不能用单元测试的内部构造函数初始化对象
假设我们有一个kotlin类定义为:
package foo class Bar internal constructor() { //... }
当我尝试从一个测试方法,如:
package foo class TestBar { @Test fun testingBar() { Bar() //<----- error } }
我收到以下错误:
Cannot access '<init>': it is internal in 'Bar'
Bar和TestBar都在同一个AndroidStudio模块中(android库)源代码的两个路径都是在gradle中定义的:
... sourceSets { main.java.srcDirs += 'src/main/kotlin' test.java.srcDirs += 'src/test/kotlin' } ...
测试似乎一般工作正常,但我无法创建任何与内部构造函数的对象。
我在用着:
ext.kotlin_version = '1.1.3-2'
编辑
感谢您的反馈。 我决定从头开始制作简单的android多模块应用程序,它工作得很好。
然后,我试图摆脱我的模块依赖关系一个接一个,事实证明,问题是由dagger2 gradle依赖。
dependencies { ... //dagger 2 implementation 'com.google.dagger:dagger:2.8' kapt 'com.google.dagger:dagger-compiler:2.8' }
当我删除依赖我能够访问内部构造从测试没有问题。 这是一个错误的指示或我的依赖没有正确定义?
编辑2(解决方案)
原来问题是由kapt的generatestubs = true
选项造成的。 为了使测试看到内部类只是切换到一个新的kapt实现:
http://kotlinlang.org/docs/reference/kapt.html
这在我的情况下来摆脱
kapt { generateStubs = true }
并添加
apply plugin: kotlin-kapt'
在gradle文件的开头。
internal
可见性意味着该类仅在同一模块中可见。 Kotlin对一个模块的定义是 :
更具体地说,一个模块是一组编译在一起的Kotlin文件:
- 一个IntelliJ IDEA模块;
- 一个Maven项目;
- 一个Gradle源集合;
- 一组调用Ant任务编译的文件。
据我所知你main
和test
是2个独立的源集,这就是为什么它不工作的原因。
main.java.srcDirs += 'src/main/kotlin' test.java.srcDirs += 'src/test/kotlin'