我正在寻找使用kotlin测试在现有android java应用程序上进行连接测试的入门。使用Base提供的示例ExampleInstrumentedTest.java通过了测试,但是将其转换为kotlin则会出现以下错误。
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
at com.tipple.ExampleInstrumentedTest.useAppContext(ExampleInstrumentedTest.kt:16)
at java.lang.reflect.Method.invoke(Native Method)
...
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Intrinsics" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.tipple.beta.test-vymqCjsywOdabXWVc-hoqA==/base.apk", zip file "/data/app/com.example.app-0snLmU24VolpPE8BTUvpfg==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.app.test-vymqCjsywOdabXWVc-hoqA==/lib/arm64, /data/app/com.example.app-0snLmU24VolpPE8BTUvpfg==/lib/arm64, /data/app/com.example.app.test-vymqCjsywOdabXWVc-hoqA==/base.apk!/lib/arm64-v8a, /data/app/com.example.app-0snLmU24VolpPE8BTUvpfg==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
使用的代码
package com.example.app
import android.content.Context
import android.support.test.InstrumentationRegistry
import android.support.test.runner.AndroidJUnit4
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
val appContext:Context = InstrumentationRegistry.getTargetContext()
assertEquals("com.example.app", appContext.packageName)
}
}
上述kotlin测试在一个新的android项目中工作,我相信我已经在gradle中正确配置了kotlin,因为其他kotlin测试工作正常。在这个现有应用中,从InstrumentationRegistry读取packageName似乎只是一个问题。
关于可能是什么原因的任何想法?
注意:我正在使用Proguard将应用程序适合单个dex。
答案 0 :(得分:0)
啊,再次威胁到护卫者。我正在缩小以适合单个dex,因此我需要确保将丢失的类保留在proguard-rules-test.pro文件中
-keep kotlin.jvm.internal.Intrinsics
现在可以工作,但是我的调试buildType中确实需要minifyEnabled false
和multiDexEnabled true
。
理想情况下,我不想为devDebug构建使用multidex,因为测试该应用与生产构建不一样。仍在寻找替代方法,并且可能会切换回仅Java测试。