Retrofit 2 模拟最佳实践

sai*_*men 8 android unit-testing mocking retrofit2

我对测试和 TDD 非常陌生,我决定使用 Retrofit2-Mock 来满足我的 api 模拟需求。Mock Retrofit2 的文档几乎不存在,我找到的唯一操作方法资源是2015 年的这篇文章和2016年的这个答案

在这些中使用了一个 BehaviorDelegate 类,它没有实现模拟的 api 接口并且需要被包装。

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

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

Abd*_*ady 9

Retrofit 的 Github 存储库上的这个问题询问您所询问的不存在的文档(在撰写此答案时它仍然处于打开状态)。

好吧,你有 2 个选择(都在你已经提到的文章中),这取决于你想如何定义你的Gives/Inputs

选项1:(OkhttpMockWebServer

如果您通常通过处理后端的 json响应(使用Postman之类的东西)来启动 TDD,并且如果您直接使用返回的 json 作为测试的输入,那么您会更有信心MockWebServer,然后使用,您将在其中复制/粘贴您已经拥有了 package.json 并从那里开始开发您的测试。

方案2:(Retrofit自己的Mock Web Server

如果您更喜欢使用代码中已使用的模型对象来定义给定/输入,这将使您的测试更具可读性和可控性,那么使用 Retrofit 的模拟 Web 服务器,就像@JakeWharton提到官方示例中的使用方式一样


这两个选项都是由Square的同样出色的人开发/维护的,所以这实际上是关于你想要如何定义你的给定/输入。


Luk*_*kas 6

我通常像这样使用 Mockito

  1. 导入改造模拟

    <dependency>
        <groupId>com.squareup.retrofit2</groupId>
        <artifactId>retrofit-mock</artifactId>
        <version>${version.retrofit}</version>
        <scope>test</scope>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)
  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));
    
    Run Code Online (Sandbox Code Playgroud)

Retrofit Mock 仅用于生成响应。