gpt4 book ai didi

android - 在 Kotlin 中编写具有特征的 Android 测试时出现 java.lang.VerifyError

转载 作者:行者123 更新时间:2023-11-29 16:00:49 25 4
gpt4 key购买 nike

我正在尝试为 Android 的 InstrumentationTestCase 创建一个特征,它包含一个抽象属性和一个使用该属性的方法。不幸的是,当我运行此测试时,它因 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 中,但我想知道该错误的确切位置、发生原因以及如何更改特征的第一个版本以使此代码正常工作。

最佳答案

这是 Kotlin 编译器中的错误:KT-3006 .

问题是您继承自需要类的特征,而没有调用父类(super class)的构造函数。编译器错误地允许这样做,它会在稍后的运行时爆炸。

正确的解决方法是显式调用 InstrumentationTestCase 的构造函数:

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

关于android - 在 Kotlin 中编写具有特征的 Android 测试时出现 java.lang.VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24696347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com