如何自动生成用于改装响应的模拟数据对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何自动生成用于改装响应的模拟数据对象?相关的知识,希望对你有一定的参考价值。

作为android开发人员编写测试代码我是新手。我在我的Android应用程序中使用Kotlin和Retrofit。

我有一个改装界面,如下所示:

@GET("/3/movie/{movieId}")
fun getMovie(@Query("api_key") apiKey: String, @Path("movieId") movieId: String): Single<TmdbMovieResp>

响应是“TmdbMovieResp”。

我的测试代码是:

`when`(mockApi.getMovie(mockApiKey, "id")).thenReturn(Single.just(mockMovieResp))

这意味着我应该制作“mockMovieResp”。但是“TmdbMovieResp”有太多的成员变量。我能做到,但太无聊了!在这种情况下,它只是一个测试。

如果我有更多的方法和响应类型,我应该一次又一次地执行类似的任务!

有什么很酷的解决方案吗?

答案

这是不同的方法。你可以使用https://github.com/andrzejchm/RESTMock

更多信息链接。用法很简单:

    RESTMockServer.whenGET(pathContains("x/y/z/"))
            .thenReturnString("your-response-json");
另一答案

在Test方法中使用Model类可以做一件事。当你使用Retrofit时,你必须有一些像Moshi,GSON这样的转换器来进行响应处理。如果你有模型类,那么使用这些类进行响应模拟,如下所示。

val success = TmdbMovieResp() //Response Model class

然后用下面的成功结果模拟其余的api调用。

`when`(mockApi.getMovie(mockApiKey, "id")).thenReturn(Single.just(success))
另一答案

而不是Mockito,使用MockK进行嘲弄,然后使用relaxed mocks

class MyClass {
  fun foo() : ComplexObject { ... }
}

@Test
fun `test foo`() {
  val myClass = spyk(MyClass())
  val complex : ComplexObject = mockk(relaxed = true)

  every { myClass.foo() } returns complex

  assertEquals(complex, myClass.foo())

  println(complex.someIntProperty) // prints 1
}

轻松的mockk返回任何值或函数的固定数据,因此您无需在无关紧要时指定所有这些单独的属性。

以上是关于如何自动生成用于改装响应的模拟数据对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段中的 JSON 响应中的对象获取数据

无法模拟 Glassfish Jersey 客户端响应对象

Server是如何完成针对请求的监听接收与响应1

html 将以编程方式附加外部脚本文件的javascript代码片段,并按顺序排列。用于响应式网站,其中ma

即使 JsonSerializer 工作,改装响应为空

VSCode自定义代码片段—— 数组的响应式方法