Насколько действителен мой модульный тест для класса Repository, который регистрируется на удаленном сервере? - PullRequest
1 голос
/ 21 ноября 2019

Мне пришлось написать модульный тест для моего класса репозитория. Я работаю над приложением REST и использую Retrofit для связи с моим REST API.

На моем ApiInterface у меня есть следующий код:

interface ApiInterface {
    /*
    Login to the api
     */
    @POST("api/auth/login")
    fun login(@Body loginFields: LoginFields): Call<LoginResponse>
}

LoginResponse и LoginFields выше приведены простые классы данных

У меня есть мой репозиторий:

class LoginRepository(private val apiInterface: ApiInterface) : ILoginRepository {

    companion object {

        val TAG = LoginRepository::class.java.simpleName
        private var loginRepository: LoginRepository? = null
        private val apiInterface: ApiInterface =
            RetrofitService.createService(ApiInterface::class.java)

        val instance: LoginRepository
            get() {
                if (loginRepository == null) {
                    loginRepository = LoginRepository(apiInterface)
                }
                return loginRepository as LoginRepository
            }
    }

    override fun getUserLogin(loginFields: LoginFields): LiveData<LoginResponse> {

        val loginResponse = MutableLiveData<LoginResponse>()

        apiInterface.login(loginFields).enqueue(object : Callback<LoginResponse> {
            override fun onResponse(
                call: Call<LoginResponse>,
                response: Response<LoginResponse>
            ) {
                if (response.isSuccessful) {
                    loginResponse.postValue(response.body())
                } else {
                    loginResponse.value = null
                    Log.e(TAG, response.errorBody().toString())
                }
            }

            override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                loginResponse.value = null
                Log.e(TAG, " Failure getting the logged in user")
                t.printStackTrace()
            }
        })
        return loginResponse
    }
}

ILoginRepository представляет собой простой интерфейс:

interface ILoginRepository {
    fun getUserLogin(loginFields: LoginFields): LiveData<LoginResponse>
}

Из того, что я слышал до сих пор,Модульные тесты предназначены для отдельных блоков кода и не должны заботиться о других классах. Итак, я создал FakeRepository, который реализует ILoginRepository и выглядит следующим образом:

class FakeRepository : ILoginRepository {
    override fun getUserLogin(loginFields: LoginFields): LiveData<LoginResponse> {
        val liveData: MutableLiveData<LoginResponse> = MutableLiveData()
        liveData.postValue(
            LoginResponse(
                "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImU3NjIxNjBmNTMxN2NlMmZiMDc0NzcxODQ1MTJjZGVjZmE4NmVkNmI3Njg5ZmM1N2UzOWYyMDJhNTQyODZlOTZlN2I3OWZjMDZhZTliODYyIn0.eyJhdWQiOiI1IiwianRpIjoiZTc2MjE2MGY1MzE3Y2UyZmIwNzQ3NzE4NDUxMmNkZWNmYTg2ZWQ2Yjc2ODlmYzU3ZTM5ZjIwMmE1NDI4NmU5NmU3Yjc5ZmMwNmFlOWI4NjIiLCJpYXQiOjE1NzQwNjA4NzUsIm5iZiI6MTU3NDA2MDg3NSwiZXhwIjoxNjA1NjgzMjc0LCJzdWIiOiIzNiIsInNjb3BlcyI6W119.S77D2pG7ScQn7ufyyVG2fhnydKWJUUv3Khotqt4K41ylP_7VWqNmIzUr0ZfeuryWvRHj0qP8kEG4hIbbfmFOnEHQBwTCVEyV7LNaazYLg9VIvXeHiQ99vZHVSyBwy-ENY772YxpBHCPy6aG5ziQM1LK357mOoIQiucLXGe1lQkwXSlqULuEqt-5tsDAgnMPz48d6cEzVF9muU2PjgwNThcPUyNkivlzHuzsj7pQWum7bALHPzcoQRNGzEzhICShCtEBQ_T0VbMakcY2Iwl2rQuxWPBiFjpNv69VfXjAxXuYkbRpRfbIiNIBuaHWOlvkOHQAbUELg6Nd88L78UN4z91SBhN6JVB3kG8ibHSHT7ip4ruLiXSRtDROX3I_mpMx_7gcqK80L2FqxnznTLbg39Mgkfsu56TbGd2NTtHBcif66SUPXsrIM-kGIvsajUz-x3VHFJvJvAvZ5zSKMq5c4pTkDYCv4g6-o7fEX3bIT94m89K5drAub8iluRFyXNnhSMi29JpSxU6LeMmuaZGvQssm170oY76ZOMe3xwVMzWatXVHtpsl51M2iC2JhXq9Z-pxd1ZAx8_HVbG01OOpqcqKoFbTFtgsl8mIxDsU91aBDHN_xqXO6EUTdm7Gz4TOo1_C5m1R5nYWuGngAXfIFzlF4L6gBUokJPs8KDPxNrBdk",
                "Bearer",
                "2020-11-18 12:52:54",
                User(
                    35,
                    "Prashanna Bhandary",
                    loginFields.email,
                    "dd58a617ea618010c2052cb54079ad67.jpeg",
                    "98********",
                    "test address 01",
                    1,
                    "yes",
                    "2019-08-30 04:56:43",
                    "2019-08-30 05:14:47",
                    0
                )
            )
        )
        return liveData
    }
}

Вы можете увидеть, что я здесь делаю.

Теперь, чтобы протестировать репозиторий, я создал модулькласс теста, подобный следующему:

class LoginRepositoryTest {
    @get:Rule
    val instantTaskExecutorRule = InstantTaskExecutorRule()
    //data input
    val loginFields = LoginFields("test@test.com", "test@123")
    //expected
    val correctLoginResponse = LoginResponse(
        "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImU3NjIxNjBmNTMxN2NlMmZiMDc0NzcxODQ1MTJjZGVjZmE4NmVkNmI3Njg5ZmM1N2UzOWYyMDJhNTQyODZlOTZlN2I3OWZjMDZhZTliODYyIn0.eyJhdWQiOiI1IiwianRpIjoiZTc2MjE2MGY1MzE3Y2UyZmIwNzQ3NzE4NDUxMmNkZWNmYTg2ZWQ2Yjc2ODlmYzU3ZTM5ZjIwMmE1NDI4NmU5NmU3Yjc5ZmMwNmFlOWI4NjIiLCJpYXQiOjE1NzQwNjA4NzUsIm5iZiI6MTU3NDA2MDg3NSwiZXhwIjoxNjA1NjgzMjc0LCJzdWIiOiIzNiIsInNjb3BlcyI6W119.S77D2pG7ScQn7ufyyVG2fhnydKWJUUv3Khotqt4K41ylP_7VWqNmIzUr0ZfeuryWvRHj0qP8kEG4hIbbfmFOnEHQBwTCVEyV7LNaazYLg9VIvXeHiQ99vZHVSyBwy-ENY772YxpBHCPy6aG5ziQM1LK357mOoIQiucLXGe1lQkwXSlqULuEqt-5tsDAgnMPz48d6cEzVF9muU2PjgwNThcPUyNkivlzHuzsj7pQWum7bALHPzcoQRNGzEzhICShCtEBQ_T0VbMakcY2Iwl2rQuxWPBiFjpNv69VfXjAxXuYkbRpRfbIiNIBuaHWOlvkOHQAbUELg6Nd88L78UN4z91SBhN6JVB3kG8ibHSHT7ip4ruLiXSRtDROX3I_mpMx_7gcqK80L2FqxnznTLbg39Mgkfsu56TbGd2NTtHBcif66SUPXsrIM-kGIvsajUz-x3VHFJvJvAvZ5zSKMq5c4pTkDYCv4g6-o7fEX3bIT94m89K5drAub8iluRFyXNnhSMi29JpSxU6LeMmuaZGvQssm170oY76ZOMe3xwVMzWatXVHtpsl51M2iC2JhXq9Z-pxd1ZAx8_HVbG01OOpqcqKoFbTFtgsl8mIxDsU91aBDHN_xqXO6EUTdm7Gz4TOo1_C5m1R5nYWuGngAXfIFzlF4L6gBUokJPs8KDPxNrBdk",
        "Bearer",
        "2020-11-18 12:52:54",
        User(
            35,
            "Prashanna Bhandary",
            loginFields.email,
            "dd58a617ea618010c2052cb54079ad67.jpeg",
            "98********",
            "test address 01",
            1,
            "yes",
            "2019-08-30 04:56:43",
            "2019-08-30 05:14:47",
            0
        )
    )
    //class under test
    private lateinit var loginRepository: FakeRepository
    @Before
    fun setUp() {
        loginRepository = FakeRepository()
        ServiceLocator.loginRepository = loginRepository
    }
    @Test
    fun correctLoginFields_geUserLogin_shouldGiveLoginResponse() {
        //when
        val loginResponse = loginRepository.getUserLogin(loginFields).value
        //then
        assertEquals(correctLoginResponse, loginResponse)
    }
}

Итак, я думаю, что мой вопрос: Насколько действителен мой модульный тест? Это то, как мы должны тестировать вещи? Этот тест дает мне какое-либо значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...