假设我们有一个 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's definition of a module is :
More specifically, a module is a set of Kotlin files compiled together:
- an IntelliJ IDEA module;
- a Maven project;
- a Gradle source set;
- a set of files compiled with one invocation of the Ant task.
据我所知
main
和 test
是 2 个独立的源集,这就是它不起作用的原因。main.java.srcDirs += 'src/main/kotlin'
test.java.srcDirs += 'src/test/kotlin'
关于unit-testing - Kapt generatetubs - 无法使用单元测试中的内部构造函数初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45007979/