在运行Android Instrumented测试进行房间迁移时,获取GSON的ClassNotFoundException

时间:2019-02-22 19:46:52

标签: android android-room android-testing

我有一个项目,我正在使用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本身看起来还不错,并且如果我尝试在测试中创建GsonGsonBuilder对象,则会收到相同的错误。

在我的依赖项中,我还添加了以下几行(使用Kotlin DSL):

dependencies {
    ... 
    androidTestImplementation("android.arch.persistence.room:testing:1.1.1")
    androidTestImplementation("com.google.code.gson:gson:2.8.0")
}

运行应用程序本身很好,存储可以按预期工作。

包括Gson并避免此错误的正确方法是什么?对我来说,无法轻松测试交易是一个问题。

1 个答案:

答案 0 :(得分:0)

好吧,我知道了。这只是一个保障问题。每当找不到一个类时,您只需要确保它没有被剥离即可。

就我而言,我将此行添加到了我的proguard文件中

$parents = [];
foreach($dom->getElementsByTagName('p') as $paragraph) {
   $parentNode = $paragraph->parentNode;
   if (!compareParentNode($parentNode,$parents)){   
      $parents[] = $paragraph->parentNode;
   }
}

然后在抱怨时继续添加更多说明。