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

В настоящее время я пытаюсь протестировать функцию входа в AuthRepository , но не могу создать экземпляр репозитория, поскольку он зависит от настраиваемого 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? Или зависимость от приложения заставит меня использовать инструментальные тесты для тестирования моего AuthRepository?

0
BlondeSwan 15 Ноя 2018 в 20:28

1 ответ

Лучший ответ

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

@Mock private lateinit var context: Application

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

    @Mock private lateinit var prefs: SharedPrefs
    
1
Sergey 15 Ноя 2018 в 17:34