如何测试使用 Retrofit 和 Dagger2 的 REST API

How to test a REST API that uses Retrofit and Dagger2

我想创建一个单元测试来验证 API 是否成功获取回购列表。我希望测试实际上建立网络连接而不是使用模拟服务器。而且,例如使用 RoboElectric 会很好,这样测试就可以在 JVM 上 运行。

这是为了测试 MVP 架构中的模型。

我正在使用 Mosby 的示例项目,它使用 Dagger 2 和 Retrofit 1.9。

public interface GithubApi
{
    @GET("/repositories")
    @Headers("Cache-Control: no-cache")
    public void getRepos(Callback<List<Repo>> callback);
}

这是模块:

@Module()
public class SampleModule
{
    @Provides @Singleton public GithubApi providesGithubApi()
    {
        OkHttpClient client = new OkHttpClient();
        client.setCache(new Cache(context.getCacheDir(), 10 * 1024 * 1024));

        RestAdapter restAdapter = new RestAdapter.Builder()
            .setClient(new OkClient(client))
            .setEndpoint("https://api.github.com")
            .build();

        return restAdapter.create(GithubApi.class);
    }
}

您搜索的关键字是集成测试。集成测试总是很棘手(因为你依赖互联网连接,测试可能不稳定),我建议你在完成所有单元和 UI 测试后继续进行。以下是两个可能对您有用的链接:

你到底想考什么? 我问是因为你似乎不清楚你到底想要什么:

  • 正在测试 API?后端的工作是提供一个完整的工作 API.
  • 测试您的应用程序是否正确进行 http 通信?听起来您想测试 Retrofit。但是 Retrofit 已经过测试。您可以假设改造有效,而无需再次测试。
  • 测试 json 是否被正确解析? Retrofit 内部使用的 jackson 或 gson 已经实现了这一点。同样,无需再次测试。

所以仍然是同样的问题:您实际上想在 "Model"(MVP 中的业务逻辑层)上测试什么?如果改造是您的整个业务逻辑,则可以测试以下内容(如上所述尚未通过外部库测试):

  • 您的 POJO 类 注释是否正确,以便 gson / jackson 正确反序列化从 Github API 收到的 json。怎么做?在那种情况下,您需要可靠的模拟数据并且不能使用实时 API。在那种情况下,您必须模拟服务器响应。否则你无法编写单元测试,因为如果你明天再次 运行 测试,GithubApi 将 return 不同的数据。
  • 您可以测试您是否在您的应用程序中正确处理了所有 http 响应代码。但是,您还必须模拟 Github API,否则您无法模拟 Github API 是 return 404 响应或 401 等。

如果您的模型只是改造,那么您可以为 "model" 单元测试编写这种单元测试。

I would like that the test actually makes the network connection instead of using a Mock Server.

我希望您现在明白需要 MockServer。

不然听起来你要写一种集成测试。但同样,您实际上想通过该集成测试测试什么?

对我来说,您似乎只是想确保您的应用程序在从 GithubAPI 加载数据并滚动 UI 中的项目列表时不会崩溃,对吗?

所以这样的 "integration tests" 可以用 Robolectric 和 Espresso 来写。但是,那实际上不是测试!在这样的测试中你有任何 assertEquals() 等吗?所以这是一个非常愚蠢的测试,因为除了您的应用程序没有崩溃之外,您无法验证任何内容。如果那是您正在寻找的,请继续,为您的 activity 编写一个 Espresso 测试,加载实时数据并一直向下滚动您的 recylcerview 直到结束。但是您实际上并没有通过这样的测试涵盖任何内容。它不可靠,不可重现,只能验证您的应用程序在 "happy path" 中没有崩溃。但这与启动应用程序时手动执行完全相同。

所以问问自己:我想测试什么?我究竟应该测试什么?如前所述,测试改造没有意义,因为它已经被 square 测试过了。测试滚动 RecyclerView 是否有效也没有意义,因为 UI 小部件 RecyclerView 已经在 android 框架中进行了内部测试。