2014-07-11 7 views
1

추상 속성 및이 속성을 사용하는 메서드가 포함 된 Android의 InstrumentationTestCase 특성을 만들려고합니다. 불행히도이 테스트를 실행하면 java.lang.VerifyError과 충돌합니다. 그래서 여기 충돌 원인이되는 코드 샘플입니다 :Kotlin에 특성이있는 Android 테스트를 작성할 때 java.reang.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() 
    } 
} 

는 그리고 내가 로그 캣에서 무엇을 얻을 :

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에 있다는 것을 이해하지만, 버그가있는 곳, 왜 그런지, 왜 내가 어떻게 내 특성을 바꾸어서 t를 만들 수 있는지 알고 싶습니다. 그의 코드 작업.

+0

이 버그는 YouTrack에보고되었다. –

답변

4

이것은 Kotlin 컴파일러의 버그입니다 : KT-3006.

문제는 당신이 수퍼 클래스의 생성자를 호출하지 않고 클래스를 필요로하는 특성을 상속하고 있다는 것입니다. 컴파일러가이를 잘못 허용하고 런타임에 나중에 불어납니다.

올바른 수정은 명시 적으로 InstrumentationTestCase의 생성자를 호출하는 것입니다 : 고정으로

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

감사합니다! 버그가 Kotlin 컴파일러에 실제로있는 것 같지만 문제는 더욱 심각합니다. 나는 단지'ApplicationTestCase'가'InstrumentationTestCase'의 서브 클래스가 아니라는 것을 알아 차렸기 때문에이 경우이 특성을 상속 할 수 없어야합니다. – Michael

+0

이 동작에 대한 버그가 발견되었습니다 : [KT-1963] (http://youtrack.jetbrains.com/issue/KT-1963). – Michael

+1

사실이 두 가지 버그는 같은 것이므로 병합했습니다. 죄송합니다. 처음에는 명확하지 않은 경우 : 예, 원래 코드는 컴파일러에서 허용해서는 안됩니다. 각 특성 요구 사항은 각 하위 클래스에서 충족되어야하지만 컴파일러는 그 순간에 –