运行 Android 房间迁移的仪器测试时获取 GSON 的 ClassNotFoundException
Getting ClassNotFoundException for GSON when running Android Instrumented test for Room migration
我有一个项目正在使用 Room 进行存储,目前正在尝试设置一个简单迁移测试。
我按照 https://medium.com/androiddevelopers/testing-room-migrations-be93cdb0d975 中描述的步骤进行了测试,结果如下所示:
@RunWith(AndroidJUnit4::class)
class MigrationsTest {
private val DB_NAME = "test.db"
private lateinit var testHelper: MigrationTestHelper
@Before
fun setup() {
testHelper = MigrationTestHelper(
androidx.test.platform.app.InstrumentationRegistry.getInstrumentation(),
MyDatabase::class.java.canonicalName,
FrameworkSQLiteOpenHelperFactory()
)
}
@Test
fun testMigrate1_2() {
val db = testHelper.createDatabase(DB_NAME, 1)
db.close()
testHelper.runMigrationsAndValidate(DB_NAME, 2, true, MyDatabase.MIGRATION_1_2)
}
}
然而,当运行在物理设备上测试时,我得到以下异常:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/gson/GsonBuilder;
MigrationTestHelper
本身看起来很好,如果我尝试在测试中创建一个 Gson
或 GsonBuilder
对象,我会得到同样的错误。
在我的依赖项中,我还添加了这些行(使用 Kotlin DSL):
dependencies {
...
androidTestImplementation("android.arch.persistence.room:testing:1.1.1")
androidTestImplementation("com.google.code.gson:gson:2.8.0")
}
运行 应用本身没问题,存储正常。
包含 Gson
并避免此错误的正确方法是什么?无法轻松测试交易对我来说是个问题。
好的,我明白了。这只是一个proguard问题。每当找不到 class 时,您只需确保它没有被删除。
在我的例子中,我将这一行添加到我的 proguard 文件中
-keep class com.google.gson.** { *; }
然后在它抱怨时继续添加更多指令。
我有一个项目正在使用 Room 进行存储,目前正在尝试设置一个简单迁移测试。
我按照 https://medium.com/androiddevelopers/testing-room-migrations-be93cdb0d975 中描述的步骤进行了测试,结果如下所示:
@RunWith(AndroidJUnit4::class)
class MigrationsTest {
private val DB_NAME = "test.db"
private lateinit var testHelper: MigrationTestHelper
@Before
fun setup() {
testHelper = MigrationTestHelper(
androidx.test.platform.app.InstrumentationRegistry.getInstrumentation(),
MyDatabase::class.java.canonicalName,
FrameworkSQLiteOpenHelperFactory()
)
}
@Test
fun testMigrate1_2() {
val db = testHelper.createDatabase(DB_NAME, 1)
db.close()
testHelper.runMigrationsAndValidate(DB_NAME, 2, true, MyDatabase.MIGRATION_1_2)
}
}
然而,当运行在物理设备上测试时,我得到以下异常:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/gson/GsonBuilder;
MigrationTestHelper
本身看起来很好,如果我尝试在测试中创建一个 Gson
或 GsonBuilder
对象,我会得到同样的错误。
在我的依赖项中,我还添加了这些行(使用 Kotlin DSL):
dependencies {
...
androidTestImplementation("android.arch.persistence.room:testing:1.1.1")
androidTestImplementation("com.google.code.gson:gson:2.8.0")
}
运行 应用本身没问题,存储正常。
包含 Gson
并避免此错误的正确方法是什么?无法轻松测试交易对我来说是个问题。
好的,我明白了。这只是一个proguard问题。每当找不到 class 时,您只需确保它没有被删除。
在我的例子中,我将这一行添加到我的 proguard 文件中
-keep class com.google.gson.** { *; }
然后在它抱怨时继续添加更多指令。