如何自动生成模拟数据对象以进行改造?

时间:2019-03-21 02:45:30

标签: android kotlin junit mockito retrofit

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

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

有没有很酷的解决方案?

3 个答案:

答案 0 :(得分: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
}

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

您可以通过在Test方法中使用Model类来做一件事。 使用Retrofit时,必须具有Moshi,GSON之类的转换器才能进行响应处理。如果您有模型类,请使用这些类进行响应模拟,如下所示。

val success = TmdbMovieResp() //Response Model class

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

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