android / android/codelab-android-datastore
"multiple instances" error when removing value during unit testing
- Lingua principale
- Kotlin
- Stelle
- 240
- Fork
- 113
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
When trying to remove some key from datastore-preferences during unittest I'm getting an error about "multiple instances" of the datastore.
The following code reproduces the problem:
`
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStoreFile
import androidx.test.core.app.ApplicationProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.SupervisorJob
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
@ExperimentalCoroutinesApi
@RunWith(RobolectricTestRunner::class)
class TestDataStore {
companion object {
private val DATASTORE_KEY = stringPreferencesKey("DATASTORE_KEY")
}
@get:Rule
val testCoroutineRule = TestCoroutineRule()
private lateinit var dataStore: DataStore
@Before
fun setup() {
val context = ApplicationProvider.getApplicationContext()
dataStore =
PreferenceDataStoreFactory.create(
scope = CoroutineScope(testCoroutineRule.testCoroutineDispatcher + SupervisorJob())
) {
context.preferencesDataStoreFile("preferences")
}
}
@Test
fun test() {
testCoroutineRule.runBlockingTest {
dataStore.edit { it[DATASTORE_KEY] = "team" }
dataStore.edit { it.remove(DATASTORE_KEY) }
}
}
}
`
The stacktrace:
`Unable to rename C:\Users\Cassio\AppData\Local\Temp\robolectric-Method_test8095984772844777287\com.nautiluslog.data.test-dataDir\files\datastore\preferences.preferences_pb.tmp.This likely means that there are multiple instances of DataStore for this file. Ensure that you are only creating a single instance of datastore for this file.
java.io.IOException: Unable to rename C:\Users\Cassio\AppData\Local\Temp\robolectric-Method_test8095984772844777287\com.nautiluslog.data.test-dataDir\files\datastore\preferences.preferences_pb.tmp.This likely means that there are multiple instances of DataStore for this file. Ensure that you are only creating a single instance of datastore for this file.
at androidx.datastore.core.SingleProcessDataStore.writeData$datastore_core(SingleProcessDataStore.kt:433)
at androidx.datastore.core.SingleProcessDataStore.transformAndWrite(SingleProcessDataStore.kt:410)
at androidx.datastore.core.SingleProcessDataStore.handleUpdate(SingleProcessDataStore.kt:276)
at androidx.datastore.core.SingleProcessDataStore.access$handleUpdate(SingleProcessDataStore.kt:76)
at androidx.datastore.core.SingleProcessDataStore$actor$3.invokeSuspend(SingleProcessDataStore.kt:242)
at androidx.datastore.core.SingleProcessDataStore$actor$3.invoke(SingleProcessDataStore.kt)
at androidx.datastore.core.SingleProcessDataStore$actor$3.invoke(SingleProcessDataStore.kt)
at androidx.datastore.core.SimpleActor$offer$2.invokeSuspend(SimpleActor.kt:122)
(Coroutine boundary)
at com.nautiluslog.data.repository.TestDataStore$test$1.invokeSuspend(TestDataStore.kt:54)
at com.nautiluslog.testutils.TestCoroutineRule$runBlockingTest$1.invokeSuspend(TestCoroutineRule.kt:30)
at kotlinx.coroutines.test.TestBuildersKt$runBlockingTest$deferred$1.invokeSuspend(TestBuilders.kt:50)`
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Inizia eseguendo il reproducer in TestDataStore.kt, in particolare il setup e le due chiamate a dataStore.edit, usando TestCoroutineRule da TestCoroutineRule.kt. Leggi le posizioni dello stack trace in SingleProcessDataStore.kt per comprendere la scrittura non riuscita e la ridenominazione; il lavoro è completato quando il test può rimuovere DATASTORE_KEY senza l’errore relativo a più istanze o alla ridenominazione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- android, kotlin
- Ambito
- database, mobile
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 45/100