我是测试和TDD的新手,我决定使用Retrofit2-Mock来满足我的api模拟需求。 关于Mock Retrofit2的文档几乎不存在,我发现的唯一指导资源是2015年的article和2016年的answer。
在这些中,使用的BehaviorDelegate类没有实现模拟的api接口,需要进行包装。
是否有更优雅的方式来获取模拟api服务?
或者我错过了重点并且Retrofit2-Mock工具不被认为是“最佳实践堆栈”? 专业,因为关于它的文章很少
答案 0 :(得分:2)
我通常像这样使用Mockito
导入改造模拟
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit-mock</artifactId>
<version>${version.retrofit}</version>
<scope>test</scope>
</dependency>
创建并使用模拟
import retrofit2.mock.Calls;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;
...
Api api = mock(Api.class); // Mockito mock
...
when(api.doSomething(param)).thenReturn(Calls.response(response));
Retrofit Mock仅用于生成响应。
答案 1 :(得分:2)
This issue上的Retrofit's Github repo正在询问您所问的不存在的文档(撰写此答案时该文档仍处于打开状态)。
好吧,您有2个选项(两个都在您已经提到的the article中),这取决于您要如何定义礼物/输入:
如果您通常通过处理您的后端的json 响应(使用类似Postman的方式来开始TDD,并且您会感到更加自信)直接返回json作为测试的输入,然后使用MockWebServer
,您将在其中复制/粘贴已有的json并从那里开始开发测试。
如果您希望使用对象为您已经在代码中使用的模型定义给定/输入,这将使您的测试更加可读性和可控性< / strong>,然后使用Retrofit的模拟网络服务器,就像official sample
在此mentioned @JakeWharton中的用法一样这两个选项都是由Square的同仁们开发/维护的,因此,这实际上与您要如何定义给定/输入有关。
答案 2 :(得分:0)
我觉得这篇文章在这种情况下可能很有用。
整个想法基于构建变体,您可以在真实的模拟服务器之间进行切换。
注释,呼叫适配器和拦截
这是注释的样子:
@Target(
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER
)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
annotation class MOCKUP(vararg val value: String)
在@GET @POST ...等之前或之后在API中使用此批注
对于完整示例here