unit-testing - 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 调用函数?
解决方案
推荐阅读
- mongodb - 从 Mongo 组聚合返回嵌入字段
- java - 返回 true 时键盘未显示在 EditText 上
- c - Bios/Real 模式下的 C 编译器?
- excel - Excel 上的复杂 VLOOKUP
- algorithm - 如何限制最近中心性算法中的步骤并降低每个步骤的效率
- c# - Microsoft.Data.SqlClient.SqlException:'无法打开登录请求的数据库“aspnet-53bc9b9d-9d6a-45d4-8429-2a2761773502”。登录失败
- c - 为什么我不能在 C 中使用 printf 打印 unsigned int?
- c# - Xamarin 表单显示图像问题
- python - 如何在 FLASK 中运行您定义的函数以构建 API
- php - 上传我的 profile.php 后 Strato HTTP 错误 500