Контекст, над которым издеваются с помощью Mockito-Kotlin, возвращает экземпляр SharedPreferences с нулевым значением после определения того, что делать при вызове getSharedPreferences

#android #kotlin #junit #mockito-kotlin

Вопрос:

У меня есть следующий тестовый класс:

 @RunWith(MockitoJUnitRunner::class) class RegistrationDataProviderUnitTest {   private val mMockContext: Context = mock {  on { getString(R.string.is_device_registered_key) } doReturn "is_device_registered_key"  on {  getSharedPreferences(  anyString(), anyInt()  )  } doReturn mMockSharedPreferences  }  private val mMockSharedPreferences: SharedPreferences = mock {  on {  getBoolean(  mMockContext.getString(R.string.is_device_registered_key), false  )  } doReturn true  on {  edit()  } doReturn mMockSharedPreferencesEditor  }  private val mMockSharedPreferencesEditor: SharedPreferences.Editor = mock()  private val okHttpClient: OkHttpClient = mock()  private val analyticsService: AnalyticsService = mock()  private val mRegistrationDataProvider =  RegistrationDataProvider(mMockContext, okHttpClient, analyticsService)   @Test  fun registrationDataProvider_CheckIfDeviceIsRegistered() {  val success: Boolean = mRegistrationDataProvider.checkIfDeviceIsRegistered()  MatcherAssert.assertThat(  "Checking that we retrieved the value of the shared preference key for when device is registered",  success  )  } }   

Я издеваюсь над контекстом и передаю фиктивные общие предпочтения при вызове getSharedPreferences.

Затем я передаю контекст в свой класс RegistrationDataProvider. Вот как выглядит этот урок:

 class RegistrationDataProvider @Inject constructor(  @ApplicationContext private val appContext: Context,  private val okHttpClient: OkHttpClient,  private val analyticsService: AnalyticsService ) {   fun checkIfDeviceIsRegistered(): Boolean {  println(appContext)  val sharedPref = appContext.getSharedPreferences(  appContext.getString(R.string.shared_preferences_key),  Context.MODE_PRIVATE  )  println(sharedPref)  return sharedPref.getBoolean(  appContext.getString(R.string.is_device_registered_key),  false  )  } }  

Когда я звоню, я ожидаю mRegistrationDataProvider.checkIfDeviceIsRegistered() , что используемые общие настройки являются экземпляром mMockSharedPreferences, однако все, что я получаю, равно нулю.

как вы можете видеть, в моей функции есть два оператора печати checkIfDeviceIsRegistered() , в которых AppContext возвращает mMockContext, а SharedPref возвращает null.

Почему это возвращает значение null и как я могу изменить тест, чтобы он возвращал правильное значение?