gpt4 book ai didi

android - Kotlin 和新的 ActivityTestRule : The @Rule must be public

转载 作者:IT老高 更新时间:2023-10-28 12:51:54 27 4
gpt4 key购买 nike

我正在尝试在 Kotlin 中为我的 android 应用程序进行 UI 测试。由于使用 ActivityTestRule 的新系统,我无法使其工作:它编译正确,并且在运行时,我得到:

java.lang.Exception: The @Rule 'mActivityRule' must be public.
at org.junit.internal.runners.rules.RuleFieldValidator.addError(RuleFieldValidator.java:90)
at org.junit.internal.runners.rules.RuleFieldValidator.validatePublic(RuleFieldValidator.java:67)
at org.junit.internal.runners.rules.RuleFieldValidator.validateField(RuleFieldValidator.java:55)
at org.junit.internal.runners.rules.RuleFieldValidator.validate(RuleFieldValidator.java:50)
at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:170)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:344)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:74)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55)
at android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:38)
at android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.java:36)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.buildAndroidRunner(AndroidAnnotatedBuilder.java:57)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:45)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runner.Computer.getRunner(Computer.java:38)
at org.junit.runner.Computer$1.runnerForClass(Computer.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84)
at org.junit.runners.Suite.<init>(Suite.java:79)
at org.junit.runner.Computer.getSuite(Computer.java:26)
at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:691)
at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:654)
at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:329)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:226)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)

这是我声明 mActivityRule 的方式:

RunWith(javaClass<AndroidJUnit4>())
LargeTest
public class RadisTest {

Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())

...
}

它已经公开了:/

最佳答案

JUnit 允许通过测试类字段或 getter 方法提供规则。

您在 Kotlin 中注释的内容是一个 属性,但 JUnit 无法识别。

以下是在 Kotlin 中指定 JUnit 规则的可能方法:

通过带注释的 getter 方法

From M13 , 注释处理器 supports annotation targets .当你写

@Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())

不过,注解将默认使用 property 目标(Java 不可见)。

但是,您可以注释属性 getter,它也是公共(public)的,因此满足 JUnit 对规则 getter 的要求:

@get:Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())

或者,您可以使用函数而不是属性来定义规则(手动实现与 @get:Rule 相同的结果)。

通过带注释的公共(public)字段

Kotlin 还允许 since the beta candidate确定性地将属性编译为 JVM 上的字段,在这种情况下,注释和修饰符将应用于生成的字段。这是使用 Kotlin 的 @JvmField 完成的。属性注释为 answered by @jkschneider .


附注:确保在 Rule 注释前加上 @ 字符,因为它现在是 the only supported syntax for annotations ,并避免使用 @publicField 作为 will soon be dropped .

关于android - Kotlin 和新的 ActivityTestRule : The @Rule must be public,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29945087/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com