programing

코틀린과 새로운 활동테스트 규칙: @Rule은 공개 규칙이어야 합니다.

goodsources 2023. 7. 30. 17:45
반응형

코틀린과 새로운 활동테스트 규칙: @Rule은 공개 규칙이어야 합니다.

코틀린에서 안드로이드 앱 UI 테스트를 하려고 합니다.활동을 사용하는 새로운 시스템 이후TestRule, 작동할 수 없습니다. 올바르게 컴파일되고 런타임에 다음과 같은 메시지가 표시됩니다.

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)

mActivity를 선언한 방법은 다음과 같습니다.규칙:

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

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

   ...
}

이미 공개되어 있습니다:/

JUNit에서는 테스트 클래스 필드 또는 Getter 메서드를 통해 규칙을 제공할 수 있습니다.

하지만 당신이 주석을 단 것은 코틀리나 숙박시설에 있지만, Junit은 그것을 인식하지 못할 것입니다.

코틀린에서 JUNit 규칙을 지정할 수 있는 방법은 다음과 같습니다.

주석이 달린 게터 방법을 통해

M13부터 주석 프로세서는 주석 대상을 지원합니다.당신이 글을 쓸 때

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

하지만, 주석은 다음을 사용할 것입니다.property기본적으로 대상(Java에는 표시되지 않음).

그러나 속성 getter에는 주석을 달 수 있으며 이는 공개적이기 때문에 규칙 getter에 대한 Junit 요구 사항을 충족합니다.

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

또는 속성 대신 함수를 사용하여 규칙을 정의할 수 있습니다(수동으로 다음과 같은 결과를 얻을 수 있음).@get:Rule).

주석이 달린 공개 필드를 통해

또한 Kotlin은 베타 후보가 JVM의 필드에 속성을 결정적으로 컴파일할 수 있도록 허용하며, 이 경우 주석과 수정자가 생성된 필드에 적용됩니다.이것은 @jkschneider가 답변한 Kotlin의 속성 주석을 사용하여 수행됩니다.


참고: 다음과 같이 접두사를 붙여야 합니다.Rulean을 사용한 주석.@이제 주석에 대해 지원되는 유일한 구문이므로 문자를 사용하지 않습니다.@publicField곧 떨어질 것이기 때문에.

Kotlin 1.0.0+에서는 다음과 같이 작동합니다.

@Rule @JvmField 
val mActivityRule = ActivityTestRule(MainActivity::class.java)

사용:

@get:Rule
var mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)

대신에@Rule사용해야 합니다.@get:Rule.

Kotlin 1.0.4 사용:

val mActivityRule: ...
    @Rule get

언급URL : https://stackoverflow.com/questions/29945087/kotlin-and-new-activitytestrule-the-rule-must-be-public

반응형