我正在测试 DAO,为此,我需要使用 getAll() 对其进行扩展生产代码中不存在的方法。
我能想到的唯一方法是使用包含 getAll() 的扩展 DAO 来扩展我的数据库实现。我需要。代码如下所示:
@Database(
entities = [
OneEntity::class,
AnotherEntity::class
],
version = 1,
exportSchema = false
)
abstract class TestDatabase : RoomDatabase() {
abstract fun getOneEntityDao(): OneEntityDao
abstract fun getAnotherEntityDao(): TestAnotherEntityDao
}
@Dao
abstract class TestAnotherEntityDao : AnotherEntityDao {
@Query("""select * from $ANOTHER_ENTITY_TABLE""")
abstract fun getAll() : Single<List<AnotherEntity>>
}
但是当我运行测试时,我收到以下错误:
`java.lang.RuntimeException: cannot find implementation for com.example.persistence.TestDatabase. TestDatabase_Impl does not exist`
我已经检查了其他答案,唯一对我有用的是移动
Testdatabase类不在测试目录中,但我宁愿在我的生产代码中没有测试类。
任何想法为什么会发生这种情况以及如何解决它?
请您参考如下方法:
您是否包含了所有必要的 TestDepenedencies 测试构建以识别 Room 内容以及 kapt 和其他必要的组件?我知道您正在尝试做什么,还没有亲自做过,但是您正在扩展生成的代码,因此这似乎可能不可靠。
您不只是将“getAll”添加到标准 DAO 类并且仅在测试中使用它的原因是什么。如果您担心其他人触摸它,您总是可以在它上面放置一个不推荐使用的标签,但是暴露这一切的界面似乎是一个更好的地方,可以更可靠地访问它。
但是,如果您觉得查询不属于任何一个表,您可以专门针对您的自定义查询需求创建一个 DAO。您可以指定 fun 执行的查询。像
@Query ( "SELECT * FROM firstTable UNION SELECT * FROM secondTable")
fun myCombiningQueryMethod() : MyEntityArray
据我所知,您不会被迫查询自己表的内容。因此,根据需要编写尽可能好的查询并为其创建一个类。
然后,如果您担心在生产代码中包含该类,只需制作一种 flavor 。拆分数据库实现,一种用于生产,一种用于测试,其中包含附加表。
希望有帮助。快乐编码。




