Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Flowables和corroutines测试Android房间事务_Android_Kotlin_Android Room_Rx Java2_Kotlin Coroutines - Fatal编程技术网

如何使用Flowables和corroutines测试Android房间事务

如何使用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

背景

在下面的测试中,我试图观察(RxJava Flowable)在事务中执行插入(协同路由/挂起)后表中项目计数的变化:

@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())
    行,测试就会死锁,永远不会完成
  • 如果我删除事务,并独立执行两个插入,测试将成功通过
  • 问题

    如何使用事务成功测试这种情况