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

Posted 小陈乱敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:带有改造和单元测试的网络调用相关的知识,希望对你有一定的参考价值。

什么是改造?

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"'.

以上是关于Android:带有改造和单元测试的网络调用的主要内容,如果未能解决你的问题,请参考以下文章

RxJava 和改造的单元测试

在改造并行网络调用中处理后台刷新令牌调用

改造返回错误 307,在 android 中调用 web 服务

如何在带有 Jest 的 react-native 中使用模拟的 fetch() 对 API 调用进行单元测试

如何将 localhost 与改造结合使用来测试 android 应用程序 kotlin [重复]

单元/仪器测试 Android Gradle。仪器测试不会运行