1. ホーム
  2. アンドロイド

[解決済み】Kotlinと新しいActivityTestRule:@Ruleはpublicでなければならない

2022-03-30 11:47:09

質問

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では、テストクラスのフィールドやゲッターメソッドでルールを提供することができます。

アノテーションしたものは、Kotlinでは プロパティ が、JUnitはこれを認識しません。

KotlinでJUnitのルールを指定する方法として考えられるのは、以下の通りです。

アノテートされたゲッターメソッドを介して

M13より アノテーションプロセッサー アノテーションターゲットをサポート . と書くと

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

を使用しますが、アノテーションは property ターゲットがデフォルトで表示されます(Javaからは見えません)。

ただし、プロパティ・ゲッターにはアノテーションを付けることができます。このゲッターもパブリックなので、ルール・ゲッターに対するJUnitの要求事項を満たしています。

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

また、プロパティの代わりに関数でルールを定義することもできます(手動で @get:Rule ).

アノテーションされたパブリックフィールドを通して

また、Kotlinでは ベータ版の候補から この場合、アノテーションとモディファイアは生成されたフィールドに適用されます。これは、Kotlinの @JvmField プロパティアノテーションを 回答者:@jkschneider .


補足:必ずプレフィックスとして Rule アノテーションに @ 文字をそのまま アノテーションで唯一サポートされている構文 を避け @publicField として はすぐに削除されます。 .