Я только начал смотреть на Room, Coroutines и Flow, и натолкнулся на нечто странное: то, что я ожидаю, чтобы быть пустым потоком, на самом деле содержит один нулевой элемент.
Мои настройки выглядит следующим образом, с generi c 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
для date
, я Я ожидаю, что он вернет пустой поток, без элементов в нем. Вместо этого у него есть один 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
элемент.
Что мне не хватает? Что здесь не так, потому что я не могу понять это. Почему я получаю один нулевой элемент в потоке с ненулевыми элементами?