You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何Mock SharedPreferencesAsync/SharedPreferencesWithCache?

测试SharedPreferencesAsync/SharedPreferencesWithCache的Mock方案

针对新的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:38:24