我目前正在使用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类中,使用带有测试数据的数据库的存储库。
我知道我可以在每个测试中填充数据库,我想使用这些数据。如果用刀柄不可能的话,那就是我要做的。我很高兴有任何建议来解决我的问题或有人回答说,我在错误的轨道上,如果这是不可能的。
谢谢您!
暂无答案!
目前还没有任何答案,快来回答吧!