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

问题描述 投票:2回答:3

作为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”有太多的成员变量。我能做到,但太无聊了!在这种情况下,它只是一个测试。

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

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

android kotlin junit mockito retrofit
3个回答
0
投票

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

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

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

0
投票

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

val success = TmdbMovieResp() //Response Model class

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

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

0
投票

而不是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返回任何值或函数的固定数据,因此您无需在无关紧要时指定所有这些单独的属性。

© www.soinside.com 2019 - 2024. All rights reserved.