首页 > 解决方案 > Kotlin 测试 API 调用

问题描述

我想测试我进行的 API 调用 - 我使用 Retrofit2 框架。

我的代码如下:

API 实用程序文件:

package com.example.nsi_prediction.API

import com.example.nsi_prediction.API.RetrofitClient.getClient

object ApiUtils {

    /**
     * Defines the used utilities for the Retrofit Client
     */

    const val BASE_URL = "http://10.0.2.2:8080/"

    fun getAPIService(): APIService {
        return getClient(BASE_URL)!!.create(
            APIService::class.java)
    }

}

改造客户端对象

object RetrofitClient {

    /**
     * Initializes the retrofit Client
     */

    private var retrofit: Retrofit? = null;

    fun getClient(baseUrl: String?): Retrofit? {
        if (retrofit == null) {
            retrofit = Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        }
        return retrofit
    }
}

API 服务文件:

interface APIService {

    /**
     * All specific API calls are defined here
     */

    @POST("/api/v1/gps")
    @Headers(
        "Accept: application/json",
        "Content-type:application/json"
    )
    fun sendGPS(@Body GPS: GPS): Call<GPS>

}

我已经这样写了我的测试:

@RunWith(JUnit4::class)
class RequestTest {

    @InjectMocks
    lateinit var RetrofitClient: RetrofitClient;

    @InjectMocks
    lateinit var gps_model: GPS;

    @Mock
    lateinit var APIs: APIService;

    @InjectMocks
    lateinit var ApiUtils: ApiUtils;

    @Before
    fun setUp() {

        MockitoAnnotations.initMocks(this)
        Mockito.`when`<Any>(APIs.sendGPS(gps_model).execute().message())
            .thenReturn("{'x': '1.4'}")

    }

    @Test
    fun setGitHubTaskTest_ReturnsTrue() {

        assertThat(APIs.sendGPS(gps_model).execute().message(), containsString("1.4"))

    }

}

但是当我运行测试时,我得到一个空指针异常:

java.lang.NullPointerException
at com.example.nsi_prediction.RequestTest.setUp(RequestTest.kt:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

我想测试不同文件相互通信的逻辑是否有效。如何正确测试我的 API 调用函数?

标签: unit-testingkotlinretrofit

解决方案


推荐阅读