Экземпляр класса приложения в модульных тестах - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь написать модульные тесты для проекта Android, но столкнулся с препятствиями при создании экземпляра класса Application.В проекте используются Retrofit и LiveData с компонентами архитектуры Android.

В настоящее время я пытаюсь протестировать мою AuthRepository login функцию, но я не могу создатьэкземпляр репозитория, поскольку он зависит от пользовательского SharedPrefs класса, который зависит от приложения класса.

AuthRepository

@Singleton
class AuthRepository @Inject constructor(
    val retrofitService: RetrofitService,
    val sessionData: SharedPrefs
) {

    fun login(username: String, password: String): LiveData<LoginResponse> {

        return getCSRF().then {
            if (it.result is GenericResponse.ErrorType) {
                // Error Accepting Terms
                val mutableLiveData = MutableLiveData<LoginResponse>()
                mutableLiveData.value = LoginResponse(listOf(LoginResponse.ErrorType.Generic()))
                mutableLiveData
            }
            else {
                retrofitService.postLogin(LoginBody(username, password))
                    .map {
                        val res = LoginRemote.parseResponse(it.response)
                        return res
                    }
            }
        }
    }
}

SharedPrefs

class SharedPrefs @Inject constructor(context: Application) {

    private val sharedPrefs = context.getSharedPreferences("com.company.project.domain.PREFERENCE_FILE_KEY", Context.MODE_PRIVATE)

    private val PREF_KEY_SESSION_COOKIE = "sessionCookie"

    // SharedPreference Variable Management
    var sessionCookie: String
    get() = sharedPrefs.getString(PREF_KEY_SESSION_COOKIE, "")
    set(value) = saveString(PREF_KEY_SESSION_COOKIE, value)

}

Имея такую ​​настройку, могу ли я выполнить простые старые UnitTests для моего AuthRepository?Или зависимость от Application вынудит меня использовать Instrumentation Tests для проверки моего AuthRepository?

1 Ответ

0 голосов
/ 15 ноября 2018

1.Вы можете издеваться над классом Application, используя Mockito:

@Mock private lateinit var context: Application

@Before fun setupTasksViewModel() {
    MockitoAnnotations.initMocks(this)
}
  1. или макет SharedPrefs объект

    @Mock private lateinit var prefs: SharedPrefs
    
...