Kotlin和新的ActivityTestRule:@Rule必须是公开的

Geo*_*tic 246 testing android kotlin android-espresso

我正在尝试在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)
Run Code Online (Sandbox Code Playgroud)

以下是我宣称的mActivityRule:

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

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

   ...
}
Run Code Online (Sandbox Code Playgroud)

它已经公开:/

des*_*eim 298

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

你注释的是Kotlin的一个属性,JUnit不会识别.

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

通过带注释的getter方法

从M13开始,注释处理器支持注释目标.当你写作

@Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())
Run Code Online (Sandbox Code Playgroud)

但是,注释将property默认使用目标(对Java不可见).

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

@get:Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())
Run Code Online (Sandbox Code Playgroud)

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

通过带注释的公共领域

科特林还允许由于测试候选确定性地编译属性在JVM上的字段,在这种情况下,注释和改性剂适用于所产生的场.这是使用Kotlin的@JvmField属性注释完成的,由@jkschneider回答.


旁注:请务必在Rule注释前加上一个@字符,因为它现在是注释唯一支持的语法,并且避免@publicField因为它很快就会被删除.


jks*_*der 244

使用Kotlin 1.0.0+,这可以:

@Rule @JvmField 
val mActivityRule = ActivityTestRule(MainActivity::class.java)
Run Code Online (Sandbox Code Playgroud)


小智 12

使用Kotlin 1.0.4:

val mActivityRule: ...
    @Rule get
Run Code Online (Sandbox Code Playgroud)

  • @JigneshAnsodariya - 我做了一张支票,这个答案提供了一个答案.有关其工作原理的更多信息,请访问以下链接 - https://kotlinlang.org/docs/reference/properties.html#getters-and-setters (10认同)

Zah*_*sal 12

用这个:

@get:Rule
var mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)
Run Code Online (Sandbox Code Playgroud)

  • 介意添加解释吗? (4认同)

Mar*_*rci 5

相反@Rule,您应该使用@get:Rule.