Android:带有改造和单元测试的网络调用

26 篇文章 1 订阅
15 篇文章 1 订阅

什么是改造?

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"'.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值