找不到房间测试数据库实施

时间:2018-09-17 13:18:20

标签: kotlin junit4 android-room koin

我正在测试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类移出测试目录,但是我宁愿不要在生产代码中使用测试类。 任何想法为什么会这样以及如何解决?

2 个答案:

答案 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方法,因为我没有看到另一种“快速”的选择,但是我会牢记您使用调味料的想法,并将在最近的未来。

谢谢!