我刚刚开始研究 Room、Coroutines 和 Flow,并且遇到了一些奇怪的事情:我所期望的空流实际上有一个 null 项。
我的设置如下,T
对我的实际实体具有通用性。
interface TDao {
@Query("SELECT * FROM Table WHERE date=:date")
fun getT(date: String): Flow<T>
}
@Singleton
class TRepository @Inject constructor(
private val apiService: TApiService,
private val Tdao: TDao
) {
suspend fun getTFor(date: String): Flow<T> =
Tdao
.getT(date)
.map {
if (it == null) {
returnTFromDatabase()
} else {
it
}
}
现在,当数据库中没有任何T
fordate
时,我希望它返回一个空流,其中没有任何项目。相反,它有一个null
元素,它永远不会发生,因为T
它不能为空。
我为它写了这个测试:
@RunWith(AndroidJUnit4::class)
class TDatabaseTest {
private lateinit var db: TDatabase
private lateinit var underTest: TDao
@Before
fun setUp() {
val context = InstrumentationRegistry.getInstrumentation().context
db = Room.inMemoryDatabaseBuilder(context, TDatabase::class.java).build()
underTest = db.TDao()
}
@After
fun tearDown() {
db.close()
}
@Test
fun givenEmptyDatabase_thenHasNoItems() {
runBlocking {
val list = underTest.getT("1999").take(1).toList()
assertEquals(1, list.size)
}
}
}
...它通过了,因为再次null
返回了一件物品。
我错过了什么?这里有什么问题,因为我无法弄清楚。为什么我在具有不可为空元素的流中得到一个空元素?