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 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
を避けます 間もなく削除されます 。
Kotlin 1.0.0以降では、これは機能します。
@Rule @JvmField
val mActivityRule = ActivityTestRule(MainActivity::class.Java)
これを使って:
@get:Rule
var mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.Java)
Kotlin 1.0.4の場合:
val mActivityRule: ...
@Rule get