如何使用Flowables和corroutines测试Android房间事务
背景 在下面的测试中,我试图观察(RxJava Flowable)在事务中执行插入(协同路由/挂起)后表中项目计数的变化:如何使用Flowables和corroutines测试Android房间事务,android,kotlin,android-room,rx-java2,kotlin-coroutines,Android,Kotlin,Android Room,Rx Java2,Kotlin Coroutines,背景 在下面的测试中,我试图观察(RxJava Flowable)在事务中执行插入(协同路由/挂起)后表中项目计数的变化: @RunWith(AndroidJUnit4::class) class Test { @get:Rule var instantTaskExecutorRule = InstantTaskExecutorRule() private lateinit var database: Database private lateinit var tra
@RunWith(AndroidJUnit4::class)
class Test {
@get:Rule var instantTaskExecutorRule = InstantTaskExecutorRule()
private lateinit var database: Database
private lateinit var transactionManager: TransactionManager
@Before
fun createDatabase() {
database = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
Database::class.java
)
.setTransactionExecutor(Executors.newSingleThreadExecutor()) // To avoid transaction deadlock
.build()
}
@After
fun closeDb() {
database.close()
}
@Test
fun getCountChanges_whenItemInserted_shouldUpdateCount(): Unit = runBlocking {
// getCountChanges() returns Flowable<Int>
val subscriber = database.item().getCountChanges().take(2).test()
val callable = suspend {
database.node().insert(NodeDO("id1")) // standard dao method marked with suspend
database.item().insert(ItemDO("id1")) // standard dao method marked with suspend
}
transactionManager.runInTransaction(callable) // just calling db.withTransaction(callable)
subscriber.assertComplete() // Test fails here - not complete ****
subscriber.assertNoErrors()
subscriber.assertValueCount(2)
assertThat(subscriber.values().first()).isEqualTo(0)
assertThat(subscriber.values().last()).isEqualTo(1)
subscriber.dispose()
}
}
@RunWith(AndroidJUnit4::class)
课堂测试{
@获取:规则变量instantTaskExecutorRule=instantTaskExecutorRule()
私有lateinit var数据库:数据库
私有lateinit var transactionManager:transactionManager
@以前
fun createDatabase(){
数据库=Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
数据库::class.java
)
.setTransactionExecutor(Executors.newSingleThreadExecutor())//以避免事务死锁
.build()
}
@之后
(b){
database.close()
}
@试验
fun getCountChanges\u何时插入\u应更新帐户():Unit=runBlocking{
//getCountChanges()返回可流动的
val subscriber=database.item().getCountChanges().take(2.test())
val callable=suspend{
database.node().insert(NodeDO(“id1”)//标记为suspend的标准dao方法
database.item().insert(ItemDO(“id1”)//用suspend标记的标准dao方法
}
transactionManager.runInTransaction(可调用)//仅调用db.withTransaction(可调用)
subscriber.assertComplete()//此处测试失败-未完成****
subscriber.assertNoErrors()
订户.assertValueCount(2)
断言(subscriber.values().first()).isEqualTo(0)
断言(subscriber.values().last()).isEqualTo(1)
subscriber.dispose()
}
}
测试结果
.setTransactionExecutor(Executors.newSingleThreadExecutor())
行,测试就会死锁,永远不会完成