Мне пришлось написать модульный тест для моего класса репозитория. Я работаю над приложением 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)
}
}
Итак, я думаю, что мой вопрос: Насколько действителен мой модульный тест? Это то, как мы должны тестировать вещи? Этот тест дает мне какое-либо значение?