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任务编译的文件。

据我所知你maintest是2个独立的源集,这就是为什么它不工作的原因。

 main.java.srcDirs += 'src/main/kotlin' test.java.srcDirs += 'src/test/kotlin'