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

Posted

技术标签:

【中文标题】无法导入 android.arch.persistence.room.testing.MigrationTestHelper【英文标题】:Cannot import android.arch.persistence.room.testing.MigrationTestHelper 【发布时间】:2017-11-28 21:37:40 【问题描述】:

我已阅读Room Persistence Library。我还克隆了android-architecture-components,然后我尝试添加迁移测试。但是,我无法导入

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.
    

【问题讨论】:

【参考方案1】:

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

结果我看到了很多例子

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

这没有意义,因为您只能使用工具测试用例来测试您的房间数据库。否则你会得到一个错误。所以你必须在你的 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"

【讨论】:

【参考方案2】:

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

使用androidTestImplementation 而不是androidTestCompile AndroidX:androidx.room:room-testing

在 gradle 中完成实现:

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

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

【讨论】:

【参考方案3】:

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

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

官方文档使用依赖进行本地单元测试。不过官方的样例使用的是Android runner...

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

【讨论】:

【参考方案4】:

您正在使用 Android 运行程序 (AndroidJUnit4.class),您的测试实际上放置在 src/androidTest。这意味着您正在使用 Instrumented Tests 应声明哪些依赖项:

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

同时,如果你写的是Local Unit Test,测试代码放在src/test,你可以声明依赖:

// Local Unit Test
testCompile ....

在 Google 文档中,他们只是给出了本地单元测试的示例。这里没有错。

【讨论】:

谢谢。我们可以在主机上将该代码作为本地单元测试运行吗? 我认为有一个错误,因为他们的示例代码使用了AndroidJUnit4 他们在src/androidTest文件夹下使用AndroidJUnit4,这需要模拟器或真实设备才能运行。 src/test文件夹下,他们使用的是JUnit,它在本地Java虚拟机(JVM)上运行,所以你不需要连接到模拟器或真实设备。

以上是关于无法导入 android.arch.persistence.room.testing.MigrationTestHelper的主要内容,如果未能解决你的问题,请参考以下文章

mysql 表导入向导无法导入 csv 文件

导入 theano 时出错“无法导入名称 gof”

无法从'@angular/forms'导入“导入FormGroup,FormControl [重复]

无法在春季导入 org.apache.poi,因此无法编译

ImportError:无法导入名称“评估”(来自意外导入评估)

vulfocus无法导入镜像