4

データの永続化に 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 を単体テストする方法を知っている人はいますか?

4

2 に答える 2

6

上記の@samaromkuの提案された回答に感謝します。これが完全な解決策です。AndroidX テストランナーを使用します。

@RunWith(AndroidJUnit4::class)
class ProfilePrefsTest {
  private lateinit var profilePrefs: ProfilePrefs
  private lateinit var context: Context

  @Before
  fun setup() {
    context = getApplicationContext<MyApplication>()
    val sharedPreferences = context.getSharedPreferences(
        "prefs",
        MODE_PRIVATE
    );
    profilePrefs = ProfilePrefs(context, sharedPreferences)

    mockStatic(DeviceInfo::class)
    every { DeviceInfo.serialNumber() } returns FAKE_SERIAL_NUMBER
  }

  @Test
  fun `Saving correct cellular download pref for device id`() {
    // Arrange
    val isEnabled = true

    // Act
    profilePrefs.setCellularDownloadingEnabled(isEnabled)

    // Assert
    assertTrue(profilePrefs.isCellularDownloadingEnabled())
}

}

于 2019-07-22T19:25:34.160 に答える
6

Robolectricに関連するクラスをテストするには、ライブラリが必要ですContext。このライブラリは、Android デバイスをシミュレートします (エミュレータなし)。
その場合、クラス RuntimeEnvironment.application.getApplicationContext()のモックオブジェクトではなく、実際のオブジェクトを返す which を使用できます。Context

2020 年 5 月現在の更新:

RuntimeEnvironment.application.getApplicationContext()非推奨になりました。

ApplicationProvider.getApplicationContext()を取得するために使用してくださいContext。また、に追加する必要があることに注意testImplementation 'androidx.test:core:1.2.0'してくださいbuild.gradle

あなたにも Espresso役立ちますが、それは機器テストです。

于 2019-07-22T18:10:20.960 に答える