Ich versuche, einen UI-Test für meine Android-App in Kotlin durchzuführen. Da das neue System ActivityTestRule verwendet, kann ich es nicht zum Laufen bringen: Es wird korrekt kompiliert und zur Laufzeit wird Folgendes angezeigt:
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)
So habe ich mActivityRule deklariert:
RunWith(javaClass<AndroidJUnit4>())
LargeTest
public class RadisTest {
Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())
...
}
Es ist bereits öffentlich: /
android
testing
android-espresso
kotlin
Geob-o-matic
quelle
quelle
Antworten:
Mit JUnit können Regeln über ein Testklassenfeld oder eine Getter-Methode bereitgestellt werden.
Was Sie kommentiert haben, ist in Kotlin eine Eigenschaft , die JUnit nicht erkennt.
Hier sind die möglichen Möglichkeiten, eine JUnit-Regel in Kotlin anzugeben:
Durch eine kommentierte Getter-Methode
Ab M13 unterstützt der Annotationsprozessor Annotationsziele . Wenn du schreibst
In der Anmerkung wird jedoch das verwendet
property
standardmäßig Ziel (für Java nicht sichtbar).Sie können jedoch den Property Getter mit Anmerkungen versehen, der ebenfalls öffentlich ist und somit die JUnit-Anforderungen für einen Rule Getter erfüllt:
Alternativ können Sie die Regel mit einer Funktion anstelle einer Eigenschaft definieren (manuell das gleiche Ergebnis wie mit erzielen
@get:Rule
).Durch ein kommentiertes öffentliches Feld
Kotlin ermöglicht es dem Beta-Kandidaten außerdem , Eigenschaften für Felder in der JVM deterministisch zu kompilieren. In diesem Fall gelten die Anmerkungen und Modifikatoren für das generierte Feld. Dies erfolgt mithilfe der Kotlin-
@JvmField
Eigenschaftsanmerkung , die von @jkschneider beantwortet wird .Randnotiz: Stellen Sie sicher, dass der
Rule
Annotation ein@
Zeichen vorangestellt wird, da dies jetzt die einzige unterstützte Syntax für Annotationen ist , und vermeiden Sie dies,@publicField
da sie bald gelöscht wird .quelle
lateinit val
Sie wurde in M14 entfernt, da sie die Unveränderlichkeit des Feldes nicht vollständig erzwang. Weitere Informationen finden Sie im [M14-Release-Blog-Beitrag] (blog.jetbrains.com/kotlin/2015/10/kotlin- m14-is-out /).Mit Kotlin 1.0.0+ funktioniert dies:
quelle
var wireMockRule = WireMockRule(wireMockConfig().dynamicPort())
.Benutze das:
quelle
Mit Kotlin 1.0.4:
quelle
Stattdessen
@Rule
sollten Sie verwenden@get:Rule
.quelle