Estou tentando fazer um teste de interface do usuário para meu aplicativo Android no Kotlin. Desde o novo sistema usando ActivityTestRule, não posso fazê-lo funcionar: ele compila corretamente e, em tempo de execução, recebo:
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)
Aqui está como eu declarei mActivityRule:
RunWith(javaClass<AndroidJUnit4>())
LargeTest
public class RadisTest {
Rule
public val mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(javaClass<MainActivity>())
...
}
Já é público: /
android
testing
android-espresso
kotlin
Geob-o-matic
fonte
fonte
Respostas:
O JUnit permite fornecer regras através de um campo de classe de teste ou de um método getter.
O que você anotou é uma propriedade no Kotlin , que a JUnit não reconhecerá.
Aqui estão as maneiras possíveis de especificar uma regra JUnit no Kotlin:
Através de um método getter anotado
No M13 , o processador de anotação suporta destinos de anotação . Quando você escreve
no entanto, a anotação usará o
property
destino por padrão (não visível para Java).No entanto, você pode anotar o getter de propriedade, que também é público e, portanto, atende aos requisitos de JUnit para um getter de regra:
Como alternativa, você pode definir a regra com uma função em vez de uma propriedade (obtendo manualmente o mesmo resultado que com
@get:Rule
).Através de um campo público anotado
O Kotlin também permite que o candidato beta compile deterministicamente propriedades dos campos na JVM; nesse caso, as anotações e modificadores se aplicam ao campo gerado. Isso é feito usando a
@JvmField
anotação de propriedade do Kotlin, conforme respondida por @jkschneider .Nota: certifique-se de prefixar a
Rule
anotação com um@
caractere, pois agora ela é a única sintaxe suportada para anotações e evite,@publicField
pois ela será eliminada em breve .fonte
lateinit val
, ele foi removido no M14 porque não impunha totalmente a imutabilidade do campo, consulte a [postagem do blog de lançamento do M14] (blog.jetbrains.com/kotlin/2015/10/kotlin- m14 está fora /).Com o Kotlin 1.0.0+, isso funciona:
fonte
var wireMockRule = WireMockRule(wireMockConfig().dynamicPort())
.Usa isto:
fonte
Com o Kotlin 1.0.4:
fonte
Em vez de
@Rule
, você deve usar@get:Rule
.fonte