我正在测试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
类移出测试目录,但是我宁愿不要在生产代码中使用测试类。
任何想法为什么会这样以及如何解决?
答案 0 :(得分:1)
您是否包括测试构建所需的所有必要TestDepenedency,以识别会议室内容以及kapt和其他必要组件?我看到您正在尝试做的事情,还没有亲自完成,但是您正在扩展生成的代码,因此这似乎不可靠。
您为什么不向标准DAO类中添加“ getAll”而仅在测试中使用它的原因是什么?如果您担心别人触摸它,可以始终在它上面放一个不赞成使用的标签,但是公开所有内容的界面似乎是一个更好的位置,可以使用更可靠的访问权限。
但是,如果您觉得查询不属于任何一个表,则可以专门针对您的自定义查询需求进行DAO。您可以指定有趣的查询。喜欢
@Query ( "SELECT * FROM firstTable UNION SELECT * FROM secondTable")
fun myCombiningQueryMethod() : MyEntityArray
据我所知,您没有被迫查询自己表的内容。因此,根据需要编写尽可能好的查询,并为其创建一个类。
然后,如果您担心在您的生产代码中使用该类,只需简单说明一下。拆分数据库实现,一种用于生产,另一种用于测试,其中包括附加表。
希望有帮助。编码愉快。
答案 1 :(得分:0)
谢谢您的回答,山姆!
关于您的评论
Have you included all the necessary TestDepenedencies for the test build to recognize Room content as well as the kapt and other necessary components?
->是的,我做到了。如我之前所写,我的问题与kapt或任何缺少的组件无关,因为将TestDatabase
放在测试文件夹路径之外的另一个文件夹中可以正常工作,并且生成了TestDatabase_Impl
。
我不是extending generated code
,而是用一个测试内存数据库替换了我的数据库,该内存可以通过getAll()
之类的测试方法访问扩展的DAO。由于我没有测试Room如何生成其组件,因此我认为只要保留DAO,就可以节省足够的钱来替换数据库。
正如您所指出的,我没有查询getAll()
,因为我的生产代码中不需要它,并且我不想为了测试而创建它(为了检查如果插入数据库有效并且例如可以检查存储的数据)
就目前而言,我认为我会按照您的建议进行操作,并在我的DAO中放置一个get方法,因为我没有看到另一种“快速”的选择,但是我会牢记您使用调味料的想法,并将在最近的未来。
谢谢!