【问题标题】:how to access internal properties from java test code如何从java测试代码访问内部属性
【发布时间】:2015-11-16 19:54:55
【问题描述】:

我有一些属性标记为内部的类。 然后我尝试从 java 中的测试代码中设置该属性。 我怎样才能访问这些属性?测试代码和类代码在同一个包中。

示例:

class MainActivity : AppCompatActivity() {
    interal var someProperty = "test"
}

测试代码:

@Test
public void firstStartTest() {
    val activity = MainActivity() 
    activity.setSomeProperty("something") //does not compile

}

Android Studio 建议使用 activity.setSomeProperty$production_sources_for_module_app(); 但这也无法编译。

【问题讨论】:

    标签: java android unit-testing kotlin


    【解决方案1】:

    两个类(MainActivity 和测试类)必须在一个模块中。这是一个模块定义:

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

    • 一个 IntelliJ IDEA 模块;
    • 一个 Maven 或 Gradle 项目;
    • 一组文件 一次调用 Ant 任务进行编译。

    https://kotlinlang.org/docs/reference/visibility-modifiers.html

    意思是,检查你的项目结构。

    【讨论】:

    • 我在同一个 gradle 项目中有它。类在 \app\src\main\kotlin\pl\orendi\bit\MainActivity.kt 和测试在 \app\src\androidTest\java\pl\orendi\bit\Test.java 我使用包字段进行现场注入,是否可以使用 kotlin?
    • 尝试创建与 Kotlin 类相同的测试。因为我没有找到任何准确描述从 Java 代码访问内部 Kotlin 属性的内容,所以假设应该与 Kotlin 代码相同,但可能不是。
    【解决方案2】:

    添加@JvmField 注解。 它将变量视为受 java 保护的

    【讨论】:

      【解决方案3】:

      有两种方法:

      • 创建属性protected。请注意 Java 和 Kotlin 如何区别对待 protected。在 Java 中,同一包中的其他类可能会访问 protected 成员。因此,您的测试类(在 Java 中)可以访问它。
      • 通过其丑陋的名称访问该属性。它应该有点像activity.setSomeProperty$production_...。使用自动完成功能。来自the documentation

        内部类的成员经过名称修改,使其 更难从 Java 中意外使用它们并允许重载 具有相同签名但看不到对方的成员 Kotlin 规则;

      【讨论】:

        猜你喜欢
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 2013-01-27
        相关资源
        最近更新 更多