java.lang.VerifyError при написании Android-тестов с характеристиками в Котлине

Я пытаюсь создать черту для InstrumentationTestCase для Android, которая содержит абстрактное свойство и метод, который использует это свойство. К сожалению, когда я запускаю этот тест, он выходит из строя с помощью java.lang.VerifyError . Итак, вот пример кода, который вызывает сбой:

 trait ExtendedInstrumentationTestCase : InstrumentationTestCase { val string: String fun printString(): Unit { println(string) } } class MyApplicationTestCase : ApplicationTestCase<Application>(javaClass<Application>()), ExtendedInstrumentationTestCase { override val string: String = "test" override fun setUp() { super<ApplicationTestCase>.setUp() printString() } override fun tearDown() { super<ApplicationTestCase>.tearDown() } } 

И это то, что я получаю от logcat:

 W/dalvikvm﹕ VFY: Lcom/kotlintest/MyApplicationTestCase; is not instance of Landroid/test/InstrumentationTestCase; W/dalvikvm﹕ VFY: bad arg 0 (into Landroid/test/InstrumentationTestCase;) W/dalvikvm﹕ VFY: rejecting call to Lcom/kotlintest/ExtendedInstrumentationTestCase$$TImpl;.printString (Landroid/test/InstrumentationTestCase;)V W/dalvikvm﹕ VFY: rejecting opcode 0x71 at 0x0000 W/dalvikvm﹕ VFY: rejected Lcom/kotlintest/MyApplicationTestCase;.printString ()V W/dalvikvm﹕ Verifier rejected class Lcom/kotlintest/MyApplicationTestCase; W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb1e90648) E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.VerifyError: com/kotlintest/MyApplicationTestCase at java.lang.Class.getDeclaredConstructors(Native Method) at java.lang.Class.getConstructors(Class.java:459) at android.test.suitebuilder.TestGrouping$TestCasePredicate.hasValidConstructor(TestGrouping.java:228) at android.test.suitebuilder.TestGrouping$TestCasePredicate.apply(TestGrouping.java:217) at android.test.suitebuilder.TestGrouping$TestCasePredicate.apply(TestGrouping.java:213) at android.test.suitebuilder.TestGrouping.select(TestGrouping.java:172) at android.test.suitebuilder.TestGrouping.selectTestClasses(TestGrouping.java:162) at android.test.suitebuilder.TestGrouping.testCaseClassesInPackage(TestGrouping.java:156) at android.test.suitebuilder.TestGrouping.addPackagesRecursive(TestGrouping.java:117) at android.test.suitebuilder.TestSuiteBuilder.includePackages(TestSuiteBuilder.java:102) at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:366) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4435) at android.app.ActivityThread.access$1300(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 

И когда я делаю метод printString() методом расширения, мои тесты начинают работать:

 trait ExtendedInstrumentationTestCase : InstrumentationTestCase { val string: String } fun ExtendedInstrumentationTestCase.printString(): Unit { println(string) } 

Насколько я понимаю, ошибка в Dalvik, но я хотел бы точно знать, где ошибка, почему это происходит и как я могу изменить первую версию своей черты, чтобы этот код работал.

Solutions Collecting From Web of "java.lang.VerifyError при написании Android-тестов с характеристиками в Котлине"

Это ошибка в компиляторе Kotlin: KT-3006 .

Проблема в том, что вы наследуете свойство, которое требует класса, без вызова конструктора суперкласса. Компилятор неправильно позволяет это, и он взрывается позже во время выполнения.

Правильное исправление заключается в том, чтобы явно вызвать конструктор InstrumentationTestCase :

 class MyApplicationTestCase : ApplicationTestCase<Application>(javaClass<Application>()), ExtendedInstrumentationTestCase, InstrumentationTestCase() { ...