2

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

4

2 回答 2

1

您是否包含了所有必要的 TestDepenedencies 测试构建以识别 Room 内容以及 kapt 和其他必要的组件?我知道您正在尝试做什么,还没有亲自做过,但是您正在扩展生成的代码,因此这似乎可能不可靠。

您不只是将“getAll”添加到标准 DAO 类并且仅在测试中使用它的原因是什么。如果您担心其他人触摸它,您总是可以在它上面放置一个不推荐使用的标签,但是暴露这一切的界面似乎是一个更好的地方,可以更可靠地访问它。

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

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

据我所知,您不会被迫查询自己表的内容。因此,根据需要编写尽可能好的查询并为其创建一个类。

然后,如果您担心在生产代码中包含该类,只需制作一种风味。拆分数据库实现,一种用于生产,一种用于测试,其中包含附加表。

希望有帮助。快乐编码。

于 2018-09-17T14:21:51.943 回答
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,而是用内存中的测试数据库替换我的数据库,该数据库提供对扩展 DAO 的访问,例如getAll(). 由于我没有测试 Room 如何生成其组件,我认为只要我保留 DAO,它就足以替换数据库。

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

现在我想我会按照你的建议去做,并在我的 DAO 中放置一个 get 方法,因为我没有看到另一个“快速”的替代方案,但我会记住你使用风味的想法,并会在最近的将来尝试它。

谢谢!

于 2018-09-18T06:12:28.540 回答