我正在测试 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 。拆分数据库实现,一种用于生产,一种用于测试,其中包含附加表。

希望有帮助。快乐编码。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!