在单元测试中实例化应用程序类

时间:2018-11-15 17:28:42

标签: unit-testing kotlin retrofit android-testing

我正在尝试在Android项目上编写单元测试,但是在创建Application类的实例时遇到了障碍。该项目使用带有Android体系结构组件的Retrofit和LiveData。

当前,我正在尝试测试 AuthRepository 登录函数,但是由于它依赖于自定义< strong> SharedPrefs 类,该类依赖于 Application 类。

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)

}

通过这种设置,我可以为AuthRepository运行简单的旧UnitTest吗?还是对 Application 的依赖会迫使我使用工具测试来测试我的AuthRepository?

1 个答案:

答案 0 :(得分:0)

1。您可以使用Mockito模拟Application类:

@Mock private lateinit var context: Application

@Before fun setupTasksViewModel() {
    MockitoAnnotations.initMocks(this)
}
  1. 或模拟SharedPrefs对象

    @Mock private lateinit var prefs: SharedPrefs