什么是改造?
Retrofit是Square开发的适用于Android、 Java和Kotlin的类型安全REST客户端。该库提供了一个强大的框架,用于验证和与API交互以及使用OkHttp发送网络请求。
什么是单元测试?
单元测试是一种软件测试,其中测试软件的单个单元或组件。目的是验证软件代码的每个单元是否按预期执行。单元测试由开发人员在应用程序的开发(编码阶段)期间完成。单元测试隔离一段代码并验证其正确性。一个单元可以是一个单独的函数、方法、过程、模块或对象。
我们的成就会是什么?
我们希望对本文进行一些基本测试。
- 首先,我们将有一个包含有效BASE_URL的Retrofit对象实例,在Test中,我们将确保BASE_URL Retrofit与我们的BASE_URL相同
- -其次,我们将为RetrofitEndpoint创建和Service分类,我们将使用Retrofit测试我们的第一个 API 调用。在Test中,我们将验证API Execution返回Success结果。
让我们进入编码部分
首先,让我们创建一个提供有效BASE_URLClient Class的实例Retrofit Object
class RetrofitClient {
val retrofit: Retrofit by lazy {
Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(MoshiConverterFactory.create())
.build()
}
}
当我们调用RetrofitClient().retrofitprovider 时,返回一个惰性实例Retrofit。
现在,让我们对Retrofit实例进行第一次测试。我们将检查提供的Retrofit实例是否具有与我们的BASE_URL匹配的BASE_URL。
第一个单元测试
对于这个测试,在包下创建一个新的Class调用。RetrofitClientTesttest
class RetrofitClientTest {
@Test
fun testRetrofitInstance() {
//Get an instance of Retrofit
val instance: Retrofit = RetrofitClient().retrofit
//Assert that, Retrofit's base url matches to our BASE_URL
assert(instance.baseUrl().url().toString() == BuildConfig.BASE_URL)
}
}
并且,运行测试。
✔️ Tests passed: 1 of 1 test - 438ms
BUILD SUCCESSFUL in 15s
28 actionable tasks: 16 executed, 12 up-to-date
8:02:23 PM: Tasks execution finished ':app:cleanTestDebugUnitTest :app:testDebugUnitTest --tests "com.rommansabbir.testing.RetrofitClientTest.testRetrofitInstance"'.
有趣,对吧?
我们有我们的第一个Retrofit单元测试,它验证给定的Retrofit实例包含一个与我们的BASE_URL完全匹配的基本 url 。
现在,让我们进入API 测试部分,我们正在创建我们的FIRST API Endpoint调用PlacesEndpoint和它的实现PlacesService。
interface PlacesEndpoint {
@Headers("Authorization: ${BuildConfig.API_KEY}")
@GET("places/nearby")
fun getVenueRecommendations(@QueryMap query: Map<String, String>): Call<ResponseWrapper>
}
class PlacesService constructor(private val retrofit: Retrofit) :
PlacesEndpoint {
private val endpoint by lazy { retrofit.create(PlacesEndpoint::class.java) }
override fun getVenueRecommendations(query: Map<String, String>): Call<ResponseWrapper> =
endpoint.getVenueRecommendations(query)
}
第二单元测试
testPlacesService()现在,为我们的RetrofitClientTest类添加一个名为的新测试。
class RetrofitClientTest {
@Test
fun testPlacesService() {
//Get an instance of PlacesService by proiving the Retrofit instance
val service = PlacesService(RetrofitClient().retrofit)
//Create a new request for our API calling
val query = VenueRecommendationsQueryBuilder()
.setLatitudeLongitude(52.376510, 4.905890)
.build()
//Execute the API call
val response = service.getVenueRecommendations(query).execute()
//Check for error body
val errorBody = response.errorBody()
assert(errorBody == null)
//Check for success body
val responseWrapper = response.body()
assert(responseWrapper != null)
assert(response.code() == 200)
}
}
我们想要达到什么目的?
验证该Retrofit实例是由各自的提供商提供的。初始化PlacesService并测试 api执行是否按预期工作。
现在,运行测试
✔️ Tests passed: 1 of 1 test - 574ms
BUILD SUCCESSFUL in 3s
28 actionable tasks: 2 executed, 26 up-to-date
8:54:14 PM: Tasks execution finished ':app:cleanTestDebugUnitTest :app:testDebugUnitTest --tests "com.rommansabbir.test.RetrofitClientTest.testPlacesService"'.