测试 RxJava2 Flowable 查询室
Test RxJava2 Flowable Query Room
我一直在尝试为我的 Room 数据库编写单元测试,这是我过去在查询 return 列表时所做的,我创建了一个允许主线程查询的数据库,但是现在我正在尝试使用 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
尝试在 运行 你的断言之前使用 testObserver.awaitTerminalEvent()
。
作为我寻找答案的一部分,我在 Medium post by Florina Muntenescu and she responded 上评论了答案。
我需要在我的测试 class 中包含 InstantTaskExecutorRule
。这将后台任务执行器替换为同步运行所有内容的执行器。为了使用它,我在模块的 build.gradle 文件中添加了以下行,请注意,虽然我不得不排除某些模块(我在应用程序和测试应用程序之间得到了支持库差异),但您可能不会:
androidTestCompile ("android.arch.core:core-testing:$roomLibraryVersion") {
exclude module: 'support-compat'
exclude module: 'support-annotations'
exclude module: 'support-core-utils'
}
现在,加上这个,我的测试 class 看起来像这样:
@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))
}
// ...
}
我一直在尝试为我的 Room 数据库编写单元测试,这是我过去在查询 return 列表时所做的,我创建了一个允许主线程查询的数据库,但是现在我正在尝试使用 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
尝试在 运行 你的断言之前使用 testObserver.awaitTerminalEvent()
。
作为我寻找答案的一部分,我在 Medium post by Florina Muntenescu and she responded 上评论了答案。
我需要在我的测试 class 中包含 InstantTaskExecutorRule
。这将后台任务执行器替换为同步运行所有内容的执行器。为了使用它,我在模块的 build.gradle 文件中添加了以下行,请注意,虽然我不得不排除某些模块(我在应用程序和测试应用程序之间得到了支持库差异),但您可能不会:
androidTestCompile ("android.arch.core:core-testing:$roomLibraryVersion") {
exclude module: 'support-compat'
exclude module: 'support-annotations'
exclude module: 'support-core-utils'
}
现在,加上这个,我的测试 class 看起来像这样:
@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))
}
// ...
}