测试RxJava2流动查询室

我一直在为我的房间数据库编写单元测试,在过去,当我有查询返回一个列表,并创建一个允许主线程查询的数据库,但现在我试图用RxJava值我没有运气。

这是我的DAO代码:

@Dao interface AccountDAO { @Query("SELECT * FROM account") fun getAll(): Flowable<List<Account>> @Insert fun insert(accounts: List<Account>): List<Long> //... } 

这里是我的数据库测试代码,我已经尝试了几件事情来通过它:

 @RunWith(AndroidJUnit4::class) class CCDatabaseTest { //... @JvmField @Rule val mainActivity = ActivityTestRule<MainActivity>(MainActivity::class.java) @Before fun setUp() { val context = mainActivity.activity database = Room.inMemoryDatabaseBuilder(context, CCDatabase::class.java).allowMainThreadQueries().build() accountDao = database.accountDao() transactionDao = database.transactionDao() } //... @Test fun testWriteReadAccount() { val testAccount = Account(TEST_ACCOUNT_NAME, TEST_ACCOUNT_BALANCE) val ids = accountDao.insert(listOf(testAccount)) assertEquals(1, ids.size) val accountsFlowable = accountDao.getAll() val testSubscriber = TestSubscriber<List<Account>>() accountsFlowable.subscribe(testSubscriber) testSubscriber.assertNoErrors() // Fails: testSubscriber.assertValueCount(1) // Fails: testSubscriber.assertValue(listOf(testAccount)) // Fails: testSubscriber.assertResult(listOf(testAccount)) } //... } 

如果有人真的希望看到或测试运行代码,请检查此存储库的应用程序刷新模块: https : //github.com/adammc331/cashcaretaker

DAO: https : //github.com/AdamMc331/CashCaretaker/blob/develop/app-refresh/src/main/java/com/adammcneilly/cashcaretaker/daos/AccountDAO.kt

测试课: https : //github.com/AdamMc331/CashCaretaker/blob/develop/app-refresh/src/androidTest/java/com/adammcneilly/cashcaretaker/data/CCDatabaseTest.kt

作为我寻找答案的一部分,我在Florina Muntenescu的一篇中篇文章中评论道,她回答了答案。

我需要在我的测试类中包含InstantTaskExecutorRule 。 这将替换后台任务执行程序与一个同步运行的一切。 为了使用它,我在模块的build.gradle文件中添加了以下代码行,注意,虽然我不得不排除某些模块(我得到了应用程序和测试应用程序之间的支持库差异),但您可能不会:

 androidTestCompile ("android.arch.core:core-testing:$roomLibraryVersion") { exclude module: 'support-compat' exclude module: 'support-annotations' exclude module: 'support-core-utils' } 

现在,添加了,我的测试类看起来像这样:

 @RunWith(AndroidJUnit4::class) class CCDatabaseTest { // ... @JvmField @Rule val instantTaskExecutorRule = InstantTaskExecutorRule() @JvmField @Rule val mainActivity = ActivityTestRule<MainActivity>(MainActivity::class.java) @Before fun setUp() { val context = mainActivity.activity database = Room.inMemoryDatabaseBuilder(context, CCDatabase::class.java).allowMainThreadQueries().build() accountDao = database.accountDao() } // ... @Test fun testWriteReadAccount() { val testAccount = Account(TEST_ACCOUNT_NAME, TEST_ACCOUNT_BALANCE) val ids = accountDao.insert(listOf(testAccount)) assertEquals(1, ids.size) accountDao.getAll() .test() .assertValue(listOf(testAccount)) } // ... } 

在运行断言之前尝试使用testObserver.awaitTerminalEvent()