首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kapt不能从单元测试中使用内部构造函数初始化对象。

Kapt不能从单元测试中使用内部构造函数初始化对象。
EN

Stack Overflow用户
提问于 2017-07-10 09:09:34
回答 1查看 938关注 0票数 4

假设我们有一个kotlin类定义为:

代码语言:javascript
运行
复制
package foo

class Bar internal constructor() {
//...
}

当我尝试从测试方法中插入该对象时,例如:

代码语言:javascript
运行
复制
package foo


class TestBar {
    @Test
    fun testingBar() {
        Bar()  //<----- error
    }
}

我得到了以下错误:

代码语言:javascript
运行
复制
Cannot access '<init>': it is internal in 'Bar'

Bar和TestBar都在同一个AndroidStudio模块(android )中,两个源的路径都是在一个gradle中定义的:

代码语言:javascript
运行
复制
...
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
    test.java.srcDirs += 'src/test/kotlin'
}
...

总的来说,测试似乎运行良好,但我无法使用内部构造函数创建任何对象。

我在用:

代码语言:javascript
运行
复制
ext.kotlin_version = '1.1.3-2'

编辑

感谢您的反馈。我决定从头开始制作简单的android多模块应用程序,它运行得很好。

然后我试着逐个摆脱我的模块依赖,结果发现问题是由dagger2 gradle依赖引起的。

代码语言:javascript
运行
复制
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

在我的例子中,这归结为摆脱了

代码语言:javascript
运行
复制
kapt {
    generateStubs = true
}

加上

apply plugin: kotlin-kapt'

在gradle文件的开头。

EN

回答 1

Stack Overflow用户

发布于 2017-07-10 12:43:16

internal可见性意味着类只能在同一个模块中可见。Kotlin关于模的定义是

更具体地说,模块是一组编译在一起的Kotlin文件:

  • IntelliJ思想模块;
  • Maven项目;
  • 分级源集;
  • 使用Ant任务的一次调用编译的一组文件。

据我所知,maintest是两个独立的源代码集,这就是它不能工作的原因。

代码语言:javascript
运行
复制
main.java.srcDirs += 'src/main/kotlin'
test.java.srcDirs += 'src/test/kotlin'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45007979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档