OMI*_*e11 9 android unit-testing android-room kotlin-coroutines kotlinx.coroutines.flow
我正在尝试从 LiveData 迁移到 Room Dao 中的 Flow。应用程序运行良好,但我在测试行为方面遇到问题。当我运行测试时,它无限期地启动和运行。我也尝试使用kotlinx.coroutines.test runBlockingTest,但我遇到了“这项工作尚未完成”的问题,就像这里。有人可以指出我如何测试我的 CoresDao 行为的正确方向吗?
@Dao
interface CoresDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertCores(cores: List<Core>)
@Transaction
suspend fun replaceCoresData(cores: List<Core>) {
deleteAllCores()
insertCores(cores)
}
@Query("SELECT * FROM cores_table")
fun getAllCores(): Flow<List<Core>>
@Query("DELETE FROM cores_table")
suspend fun deleteAllCores()
}
@RunWith(AndroidJUnit4::class)
class CoresDaoTest {
private lateinit var database: SpaceDatabase
private lateinit var coresDao: CoresDao
private val testDispatcher = TestCoroutineDispatcher()
private val testCoresList = listOf(core2, core3, core1)
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
@Before
fun setup() {
Dispatchers.setMain(testDispatcher)
val context = InstrumentationRegistry.getInstrumentation().targetContext
database = Room.inMemoryDatabaseBuilder(context, SpaceDatabase::class.java).build()
coresDao = database.coresDao()
}
@After
fun cleanup() {
database.close()
Dispatchers.resetMain()
testDispatcher.cleanupTestCoroutines()
}
@Test
fun testGetAllCores(): Unit = runBlocking {
withContext(Dispatchers.Main) {
runBlocking { coresDao.insertCores(testCoresList) }
val coresList = mutableListOf<Core>()
coresDao.getAllCores().collect { cores -> coresList.addAll(cores) }
assertThat(coresList.size, equalTo(testCoresList.size))
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 9
为了测试 Flow,我发现最好的 API 是.take(n).toList(). 您可以使用runBlockingTest并且不需要使用withContext将执行移动到另一个线程。
你可以在这里找到它是如何工作的一个例子:https : //github.com/manuelvicnt/MathCoroutinesFlow/blob/master/app/src/test/java/com/manuelvicnt/coroutinesflow/fibonacci/impl/NeverEndingFibonacciProducerTest.kt#L38
| 归档时间: |
|
| 查看次数: |
2868 次 |
| 最近记录: |