unit-testing - Kapt generatetubs - 无法使用单元测试中的内部构造函数初始化对象

标签 unit-testing constructor kotlin dagger-2

假设我们有一个 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.


据我所知maintest是 2 个独立的源集,这就是它不起作用的原因。
main.java.srcDirs += 'src/main/kotlin'
test.java.srcDirs += 'src/test/kotlin'

关于unit-testing - Kapt generatetubs - 无法使用单元测试中的内部构造函数初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45007979/

相关文章:

unit-testing - 服务级别单元测试与端到端测试之间的区别

java - PowerMock + Robolectric + ActiveAndroid

swift - Xcode 9 - 测试目标 X 遇到错误(无法连接到测试管理器)

android - io.mockk.MockKException : Failed matching mocking signature for SignedCall

android - 在 Kodein 中传递 lambda 作为参数

javascript - Mocha 和 Chai ,我如何模拟预期结果?

c# - 调用 COM 类的非默认构造函数

c++ - 对构造函数的调用不能出现在常量表达式中

javascript - 如何检测函数是否被称为构造函数?

java - 解释在 Kotlin 方法上使用 @JvmOverloads 生成的 Java 代码