For some reason, coroutines launched inside of a test performing Room operations don't execute (unless i call advanceUntilIdle
hundreds of thousands of times). I use RobolectricTestRunner
.
Robolectric version: 4.14
, Room: 2.6.1
, Coroutines: 1.10.1
Entity
@Entity
internal data class DNDScheduleCalendarCriteriaEntity(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val likeName: String
)
DAO
@Dao
internal interface DNDScheduleCalendarCriteriaDAO {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertCriteria(criteriaEntity: DNDScheduleCalendarCriteriaEntity)
@Query("SELECT * FROM DNDScheduleCalendarCriteriaEntity LIMIT 1")
fun criteriaFlow(): Flow<DNDScheduleCalendarCriteriaEntity?>
}
Database
@Database(entities = [DNDScheduleCalendarCriteriaEntity::class], version = 1)
internal abstract class DNDScheduleCalendarCriteriaDb: RoomDatabase() {
abstract fun dao(): DNDScheduleCalendarCriteriaDAO
}
Test code
// inside of @Before
context = ApplicationProvider.getApplicationContext()
db = Room.inMemoryDatabaseBuilder(
context,
DNDScheduleCalendarCriteriaDb::class.java
).build()
@Test
fun test() = runTest(
StandardTestDispatcher()
) {
db.dao().insertCriteria(DNDScheduleCalendarCriteriaEntity(likeName = "like name event"))
launch {
// doesn't get printed
println(db.dao().criteriaFlow().first())
}
runCurrent()
advanceUntilIdle()
}