无法导入android.arch.persistence.room.testing.MigrationTestHelper

时间:2017-06-26 04:20:38

标签: android database-migration android-room android-architecture-components

我看过Room Persistence Library。我还克隆android-architecture-components然后我尝试添加Mirgration测试。但是,我无法导入

import android.arch.persistence.room.testing.MigrationTestHelper;

我也使用最新的lib版本。

android.arch.core:core-testing:1.0.0-alpha3

以下是MigrationTest的代码

import android.arch.persistence.db.SupportSQLiteDatabase;
import android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;
import android.arch.persistence.room.testing.MigrationTestHelper;

@RunWith(AndroidJUnit4.class)
public class MigrationTest {
    private static final String TEST_DB = "migration-test";

    @Rule
    public MigrationTestHelper helper;

    public MigrationTest() {
        helper = new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
                MigrationDb.class.getCanonicalName(),
                new FrameworkSQLiteOpenHelperFactory());
    }

    @Test
    public void migrate1To2() throws IOException {
        SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 1);

        // db has schema version 1. insert some data using SQL queries.
        // You cannot use DAO classes because they expect the latest schema.
        //db.execSQL(...);

        // Prepare for the next version.
        db.close();

        // Re-open the database with version 2 and provide
        // MIGRATION_1_2 as the migration process.
        db = helper.runMigrationsAndValidate(TEST_DB, 2, true, MIGRATION_1_2);

        // MigrationTestHelper automatically verifies the schema changes,
        // but you need to validate that the data was migrated properly.
    }
}

4 个答案:

答案 0 :(得分:5)

由于代码使用AndroidJUnit4,所以只需使用androidTestCompile

 androidTestCompile "android.arch.persistence.room:testing:$arch_version"

本地单元测试的官方doc使用依赖性。但是,官方样本使用的是Android跑者...

https://developer.android.com/topic/libraries/architecture/adding-components.html

答案 1 :(得分:2)

您使用的是Android版试剂(AndroidJUnit4.class),您的测试实际上位于src/androidTest。这意味着您正在使用Instrumented Tests应声明哪些依赖项:

// Instrumented Unit Test or UI Test
androidTestComplile ....  

同时,如果您正在编写Local Unit Test,测试代码放在src/test,您可以声明依赖项:

// Local Unit Test
testCompile ....

在Google文档中,他们只是举例说明本地单元测试。这里没有错。

答案 2 :(得分:2)

主要问题是Google为JUnit 本地测试用例提供文档,而不是工具性的(这意味着在真实设备或仿真器上进行测试)。

结果,我看到了许多

的示例
testImplementation "androidx.room:room-testing:$room_version"

这是没有道理的,因为您只能使用工具测试用例来测试您的房间db。否则,您将得到一个错误。因此,您必须在gradle文件中使用 androidTestImplementation 而不是testImplementation。

def room_version = "2.2.5"
def test_version = "1.2.0"
androidTestImplementation "androidx.test:runner:$test_version"
androidTestImplementation "androidx.test:rules:$test_version"
androidTestImplementation "androidx.room:room-testing:$room_version"

答案 3 :(得分:0)

QuangUmAnusorn的答案是正确的,但有些过时了。对于那些想知道的人:

  • 使用androidTestImplementation代替androidTestCompile
  • AndroidX:androidx.room:room-testing

在gradle中完成实现:

androidTestImplementation "androidx.room:room-testing:$room_version"

(2.2.4是撰写本文时的最新版本)