SharedPreferencesはしばらく使えると思いますが、最近はCoroutineFlowに対応しているDataStoreで設定値を保存するようにGoogleがオススメしています。下記ようにBoolean値を書き込むDataStoreがあるとしてそのユニットテストを書いてみます。DataStoreの使い方はネットにいっぱいあるので割愛します。

class Flag(private val dataStore: DataStore<Preferences>) {
    suspend fun consume() {
        dataStore.edit { it["key"] == true }
    }

    suspend fun load(): Flow<Boolean?> =
        dataStore.data.map { it["key"] }
    }
}

val Context.dataStore: DataStore<Preferences> by preferencesDataStore(
    name = "data_store_v1"
)

// 下記のように使う
val flag = Flag(context)

まずはCoroutineとDataStoreのユニットテストのための便利クラスを作っておきましょう。

@ExperimentalCoroutinesApi
abstract class JunitTest {
    val dispatcher = UnconfinedTestDispatcher()

    @CallSuper
    @Before
    open fun setUp() {
        Dispatchers.setMain(dispatcher)
        TestTaskExecutor.onBefore()
    }

    @CallSuper
    @After
    open fun tearDown() {
        Dispatchers.resetMain()
        TestTaskExecutor.onAfter()
    }
}

@ExperimentalCoroutinesApi
abstract class JunitDataStoreTest : JunitTest() {
    private val context: Context = InstrumentationRegistry.getInstrumentation().targetContext
    private val dataStoreName: String = "datastore_name"
    val scope = TestScope(dispatcher + Job())
    val dataStore = PreferenceDataStoreFactory.create(
        scope = scope,
        produceFile = { context.preferencesDataStoreFile(dataStoreName) }
    )
}

何も設定値を書き込んでいない状態ではflag.load()を呼び出したらnullが返ってきて、flag.consume()を実行してからflag.load()を呼び出したらtrueが返ってくるというユニットテストを書きます。

@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
class FlagTest : JunitDataStoreTest() {
    private val flag = Flag(context)
    
    @Test
    fun returnNull_returnTrue() {
        scope.runTest {
            assertThat(flag.load().firstOrNull()).isNull()
            flag.consume()
            assertThat(flag.load().firstOrNull()).isTrue()
        }
    }
}

データを保存するにあたってロジックが入っている場合はこのテストコードを参考にしてロジックを含むDataStoreのテストコードが書けるでしょう。