我是以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”成员变量太多。 我可以做到,但是太无聊了! 在这种情况下,只有一个测试。
如果我有更多的方法和响应类型,我应该一次又一次地执行类似的任务!
有没有很酷的解决方案?
答案 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))