测试RxJava2可流动查询室

Ada*_*331 6 kotlin rx-java2 android-room

我一直在尝试为我的Room数据库编写单元测试,我以前在查询返回列表时已经完成了,我创建了一个允许主线程查询的数据库,但现在我正在尝试测试RxJava值我没有运气.

这是我的DAO代码:

@Dao
interface AccountDAO {
    @Query("SELECT * FROM account")
    fun getAll(): Flowable<List<Account>>

    @Insert
    fun insert(accounts: List<Account>): List<Long>

    //...
}
Run Code Online (Sandbox Code Playgroud)

这是我的数据库测试代码,我已经尝试了一些事情来让它通过:

@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))
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

如果有人真的想看或测试运行代码,请查看此存储库的app-refresh模块: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

Ada*_*331 15

作为我回答此问题的一部分,我评论了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'
}
Run Code Online (Sandbox Code Playgroud)

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

@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))
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)