未找到房间测试数据库实现

Room test database implementation not found

我正在测试 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 class 移出测试目录,但我宁愿不进行测试 class 在我的生产代码中。 任何想法为什么会发生这种情况以及如何解决它?

您是否包含了测试构建所需的所有 TestDepenedencies 以识别 Room 内容以及 kapt 和其他必要组件?我看到你想做什么,还没有亲自做过,但你正在扩展生成的代码,所以这看起来可能不可靠。

您为什么不将 "getAll" 添加到标准 DAO class 而只在测试中使用它。如果您担心其他人会触及它,您总是可以在它上面扔一个弃用的标签,但是公开它的界面似乎是一个更好的地方,可以更可靠地访问它。

但是,如果您觉得该查询不属于任何一个 table,您可以专门针对您的自定义查询需求创建一个 DAO。您可以指定 fun 执行的查询。喜欢

@Query ( "SELECT * FROM firstTable UNION SELECT * FROM secondTable")
fun myCombiningQueryMethod() : MyEntityArray

据我所知,您没有被迫查询自己的 table 的内容。因此,根据需要编写尽可能好的查询并为其创建 class。

然后,如果您担心在您的生产代码中包含 class,只需制作一个 flavor。拆分数据库实现,一种用于生产,一种用于测试,其中包括额外的 table.

希望对您有所帮助。编码愉快。

谢谢山姆的回答!

关于您的评论

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,但我用内存中的测试数据库替换了我的数据库,该数据库提供对扩展 DAOs 的访问,测试方法如 getAll()。由于我没有测试 Room 如何生成其组件,因此我认为只要保留 DAO,它就足以替换数据库。

正如您所指出的,我没有查询 getAll() 因为我的生产代码中不需要它而且我不想为了测试而创建它(为了检查数据库中的插入是否有效,例如能够检查存储的数据)

现在我想我会按照你的建议去做,并在我的 DAO 中加入一个 get 方法,因为我没有看到另一个 "fast" 替代方法,但我会记住你使用 flavors 的想法并且会近期试试。

谢谢!