Flutter中如何Mock SharedPreferencesAsync/SharedPreferencesWithCache?
针对新的SharedPreferencesAsync和SharedPreferencesWithCache API,由于旧的setInitialMockValues已不再适用,你可以通过以下几种方式创建测试用的Mock/Fake实现:
1. 使用Mock框架直接Mock接口
借助MockK或Mockito这类支持Coroutine的Mock框架,你可以直接Mock接口的suspend方法,自定义返回逻辑:
示例(MockK):
// Mock SharedPreferencesAsync val mockAsyncPrefs = mockk<SharedPreferencesAsync>() // 自定义getString方法的返回 coEvery { mockAsyncPrefs.getString("user_name", null) } returns "mocked_sai" // Mock Editor行为 coEvery { mockAsyncPrefs.edit() } returns mockk<SharedPreferencesAsync.Editor> { coEvery { putString("user_name", any()) } returns this coEvery { apply() } returns Unit } // 若需要Mock SharedPreferencesWithCache val mockCachedPrefs = mockk<SharedPreferencesWithCache>() coEvery { mockCachedPrefs.getInt("theme_mode", 0) } returns 1
2. 实现测试专用的Fake类
如果需要更灵活的控制或复杂的场景,手动实现一个Fake类会比Mock框架更直观,还能轻松预设初始值:
class FakeSharedPreferencesAsync : SharedPreferencesAsync { private val dataStore = mutableMapOf<String, Any?>() override suspend fun getString(key: String, defaultValue: String?): String? { return dataStore[key] as? String ?: defaultValue } override suspend fun getInt(key: String, defaultValue: Int): Int { return dataStore[key] as? Int ?: defaultValue } // 按需实现其他get方法(getBoolean, getLong等) override suspend fun edit(): Editor = FakeEditor(dataStore) inner class FakeEditor(private val dataStore: MutableMap<String, Any?>) : SharedPreferencesAsync.Editor { override suspend fun putString(key: String, value: String?): Editor { dataStore[key] = value return this } override suspend fun putInt(key: String, value: Int): Editor { dataStore[key] = value return this } // 按需实现其他put方法 override suspend fun apply() = Unit override suspend fun commit(): Boolean = true } }
使用Fake类预设初始值:
val fakePrefs = FakeSharedPreferencesAsync().apply { // 提前设置测试需要的初始数据 edit().putString("test_key", "initial_test_value").apply() }
3. 组合Mock构建SharedPreferencesWithCache
SharedPreferencesWithCache是基于SharedPreferencesAsync的缓存封装,你可以用Mock的SharedPreferencesAsync实例来构建它,同时控制缓存的行为:
val mockAsyncPrefs = mockk<SharedPreferencesAsync>() coEvery { mockAsyncPrefs.getString("cached_key", "default") } returns "async_mocked_value" // 创建带缓存的实例,可自定义缓存过期时间 val cachedPrefs = SharedPreferencesWithCache(mockAsyncPrefs, cacheExpiryMs = 30000)
内容的提问来源于stack exchange,提问作者Sai Kumar
相关产品推荐
相关产品推荐

