web-dev-qa-db-ja.com

Kotlinと新しいActivityTestRule:@Ruleはパブリックでなければなりません

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>())

   ...
}

すでに公開されています:/

228
Geob-o-matic

JUnitでは、テストクラスフィールドまたはゲッターメソッドを通じてルールを提供できます。

注釈を付けたのはKotlin apropertyですが、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では、 ベータ候補 により、プロパティをJVMのフィールドに確定的にコンパイルすることもできます。この場合、生成されたフィールドに注釈と修飾子が適用されます。これは、Kotlinの @JvmField プロパティアノテーションを使用して answered @jkschneider として行われます。


サイドノート:Ruleアノテーションの前に必ず@文字を追加してください。これは、 アノテーションの唯一のサポートされた構文 であり、@publicFieldを避けます 間もなく削除されます

288
desseim

Kotlin 1.0.0以降では、これは機能します。

@Rule @JvmField 
val mActivityRule = ActivityTestRule(MainActivity::class.Java)
231
jkschneider

これを使って:

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

Kotlin 1.0.4の場合:

val mActivityRule: ...
    @Rule get
11
janin