房间数据库的非仪器测试

时间:2019-04-24 03:33:39

标签: android unit-testing android-room

我正在为服务层编写测试(不是仪器测试)。我想使用实际的DAO层代替模拟,因为这会使服务层测试更具功能性(IMHO)。我知道如何为仪器测试创建内存房间db:

val context = ApplicationProvider.getApplicationContext<Context>()
db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build()

但是,这在其他测试中将不起作用,因为对getApplicationContext的调用将对InstrumentationRegistry的调用在非仪器测试中不起作用。我意识到房间测试应该是仪器测试;他们是。所有DAO测试都是仪器测试,旨在测试已编写的查询。我也意识到这些从技术上讲不是单元测试;我可以。以我的经验,不模拟存储库层的服务层测试的脆弱性要小于那些。无论如何,我的问题是-我怎样才能实现这个目标?有没有一种方法无需工具即可检索应用程序上下文?是否有一个不需要应用程序上下文的房间数据库替身?还是我需要为测试实现另一个版本的DAO类?

1 个答案:

答案 0 :(得分:1)

robolectric将允许您运行这种测试。

@RunWith(RobolectricTestRunner::class)
@Config(sdk = [27])
class Db {
    private lateinit var db: AppDatabase
    private lateinit var myDao: myDaoType

    @Before
    fun createDB() {
        val context = InstrumentationRegistry.getInstrumentation().targetContext
        db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)
            .fallbackToDestructiveMigration().allowMainThreadQueries().build()
        myDao = db.myDao()
    }

    @After
    fun closeDb() {
        db.close()
    }
}