我正在为服务层编写测试(不是仪器测试)。我想使用实际的DAO层代替模拟,因为这会使服务层测试更具功能性(IMHO)。我知道如何为仪器测试创建内存房间db:
val context = ApplicationProvider.getApplicationContext<Context>()
db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build()
但是,这在其他测试中将不起作用,因为对getApplicationContext
的调用将对InstrumentationRegistry
的调用在非仪器测试中不起作用。我意识到房间测试应该是仪器测试;他们是。所有DAO测试都是仪器测试,旨在测试已编写的查询。我也意识到这些从技术上讲不是单元测试;我可以。以我的经验,不模拟存储库层的服务层测试的脆弱性要小于那些。无论如何,我的问题是-我怎样才能实现这个目标?有没有一种方法无需工具即可检索应用程序上下文?是否有一个不需要应用程序上下文的房间数据库替身?还是我需要为测试实现另一个版本的DAO类?
答案 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()
}
}