【发布时间】:2023-03-08 09:02:01
【问题描述】:
我正在进入一个使用 SharedPreferences 进行数据持久性的遗留代码库。我想测试保存/检索值,使用 MockK 进行模拟。但是,此单元测试中的断言永远不会通过。好像 SharedPrefs 在测试中没有正确存储:
class MyProfilePrefsTest {
private lateinit var myProfilePrefs: ProfilePrefs
@RelaxedMockK private lateinit var mockSharedPrefs: SharedPreferences
@RelaxedMockK private lateinit var context: Context
@Before
fun setup() {
MockKAnnotations.init(this)
val sharedPreferences = mockk<SharedPreferences>()
every { sharedPreferences.edit() } returns (mockk())
myProfilePrefs = ProfilePrefs(context, sharedPreferences)
mockStatic(DeviceInfo::class)
every { DeviceInfo.serialNumber() } returns "fake_serial"
}
@Test
fun `Saving correct cellular download pref for device id`() {
// Arrange
val isEnabled = true
// Act
myProfilePrefs.setCellularDownloadingEnabled(isEnabled)
// Assert
assertTrue(myProfilePrefs.getCellularDownloadingEnabled())
}}
有人知道如何对 SharedPrefs 进行单元测试吗?
【问题讨论】:
-
我认为被嘲笑的
SharedPreferences.Editor是问题所在;因为它是一个模拟,所以调用commit()或apply()实际上不会做任何事情。 -
那有必要mock
Editor吗? -
我没有为 SharedPreferences 编写单元测试的经验。我通常希望您改为使用带有真实首选项存储的仪器测试(您可以根据需要设置和拆除),但即使在那里我也没有真正的经验。
标签: android unit-testing sharedpreferences mockk