android hilt测试:每个测试绑定不同的数据库

0ejtzxu1  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(321)

我目前正在使用hilt为我的android应用程序编写测试。这个应用程序有一个房间数据库,我想用在我的测试课上。此外,我希望在一些测试类中有一个空数据库,在另一些类中有一个带有测试值的数据库。我的问题是,我是否可以在测试中定义哪个提供者(空/满db)用于测试类中发生的所有注入?
我尝试使用@named注解、限定符和@bindvalue。对于前两个,我能够为我的数据库使用正确的提供者,但我不知道在注入存储库时如何使用它。对于@bindvalue,我不确定是否可以使用它。
下面是我的问题的一些简化代码:
测试数据库模块:

@Module
@TestInstallIn(components = SingletonComponent.class, replaces = DatabaseModule.class)
public class TestDatabaseModule {

    // Provide empty DB
    @Singleton
    @Provides
    AppDatabase provideInMemoryDbEmpty(@ApplicationContext Context context) {
        return Room.inMemoryDatabaseBuilder(context, AppDatabase.class).build();
    }

    // Provide populated DB
    @Singleton
    @Provides
    AppDatabase provideInMemoryDbFull(@ApplicationContext Context context, Provider<AppDatabase> databaseProvider) {
        // AppDatabasePopulateCallback adds some test data
        return Room.inMemoryDatabaseBuilder(context, AppDatabase.class).addCallback(new AppDatabasePopulateCallback(databaseProvider)).build();
    }
}

提供dao和存储库的模块

@InstallIn(SingletonComponent.class)
@Module
public class AccessModule {

    @Singleton
    @Provides
    MyDao provideMyDao(AppDatabase appDatabase) {
        return appDatabase.myDao();
    }

    @Provides
    MyRepository providesMyRepository(MyDao myDao) {
        return new MyRepository(myDao);
    }
}

一级测试:

@HiltAndroidTest
@SmallTest
public class TestOne {

    @Rule
    public HiltAndroidRule hiltRule = new HiltAndroidRule(this);

    @Rule
    public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();

    // Inject repository that uses empty DB
    @Inject
    MyRepository myRepository;

    @Before
    public void createDb() {
        hiltRule.inject();
    }

    @Test
    public void testOne() {
        // Use my repository with the empty database
    }

测试等级二:

@HiltAndroidTest
@SmallTest
public class TestTwo {

    @Rule
    public HiltAndroidRule hiltRule = new HiltAndroidRule(this);

    @Rule
    public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();

    // Inject repository that uses populated DB
    @Inject
    MyRepository myRepository;

    @Before
    public void createDb() {
        hiltRule.inject();
    }

    @Test
    public void testTwo() {
        // Use my repository with the full database
    }

因此,在testone类中,我想使用可以访问空数据库的存储库,在testtwo类中,使用带有测试数据的数据库的存储库。
我知道我可以在每个测试中填充数据库,我想使用这些数据。如果用刀柄不可能的话,那就是我要做的。我很高兴有任何建议来解决我的问题或有人回答说,我在错误的轨道上,如果这是不可能的。
谢谢您!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题