改造2个模拟最佳实践

时间:2018-02-15 07:13:46

标签: android unit-testing mocking retrofit2

我是测试和TDD的新手,我决定使用Retrofit2-Mock来满足我的api模拟需求。 关于Mock Retrofit2的文档几乎不存在,我发现的唯一指导资源是2015年的article和2016年的answer

在这些中,使用的BehaviorDelegate类没有实现模拟的api接口,需要进行包装。

是否有更优雅的方式来获取模拟api服务?

或者我错过了重点并且Retrofit2-Mock工具不被认为是“最佳实践堆栈”?  专业,因为关于它的文章很少

3 个答案:

答案 0 :(得分:2)

我通常像这样使用Mockito

  1. 导入改造模拟

    <dependency>
        <groupId>com.squareup.retrofit2</groupId>
        <artifactId>retrofit-mock</artifactId>
        <version>${version.retrofit}</version>
        <scope>test</scope>
    </dependency>
    
  2. 创建并使用模拟

    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));
    
  3. Retrofit Mock仅用于生成响应。

答案 1 :(得分:2)

This issue上的Retrofit's Github repo正在询问您所问的不存在的文档(撰写此答案时该文档仍处于打开状态)。

好吧,您有2个选项(两个都在您已经提到的the article中),这取决于您要如何定义礼物/输入

选项1:(OkhttpMockWebServer

如果您通常通过处理您的后端的json 响应(使用类似Postman的方式来开始TDD,并且您会感到更加自信)直接返回json作为测试的输入,然后使用MockWebServer,您将在其中复制/粘贴已有的json并从那里开始开发测试。

选项2:(Retrofit自己的Mock Web Server

如果您希望使用对象为您已经在代码中使用的模型定义给定/输入,这将使您的测试更加可读性和可控性< / 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