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

时间:2016-01-25 22:38:21

标签: android testing retrofit dagger mosby

我想创建一个单元测试,用于验证API是否成功获取了Repos列表。我希望测试实际上建立网络连接而不是使用模拟服务器。而且,最好使用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);
    }
}

2 个答案:

答案 0 :(得分:26)

你真的想测试什么? 我问,因为你似乎不清楚你真正想要的是什么:

  • 测试API?提供完全可用的API是后端的工作。
  • 测试您的应用是否正确进行了http通信?听起来你想测试Retrofit。但Retrofit已经过测试。您可以认为改造有效并且您不必再次进行测试。
  • 测试json是否正确解析?这已经是由Retrofit内部使用的jackson或gson所做的。同样,没有必要再次测试。

所以仍然是同一个问题:你真正想要测试什么&#34;模型&#34; (MVP中的业务逻辑层)?如果改造是您的整个业务逻辑,那么可以测试以下内容(尚未经过上述外部库测试):

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

因此,您可以为单元测试&#34;模型&#34;进行单元测试。如果您的模型只是改造。

  

我希望测试实际上建立网络连接而不是使用模拟服务器。

我希望你现在明白需要一个MockServer。

否则听起来你想要编写一种集成测试。但同样,你真的想用集成测试测试什么?

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

所以这样的&#34;集成测试&#34;可以用Robolectric和Espresso书写。但是,这实际上不是一个考验!在这样的测试中你有assertEquals()等吗?所以这是一个非常愚蠢的测试,因为除了您的应用程序没有崩溃之外,您无法验证任何内容。如果这是您正在寻找的,请继续,为您的活动写一个Espresso测试,加载实时数据并将您的recylcerview一直向下滚动直至结束。但是你实际上已经用这样的测试覆盖了什么。它不可靠,可重现,只能验证您的应用是否在“快乐路径”中崩溃了#34;。但这与在启动应用程序时手动执行操作非常相似。

所以问问自己:我想测试什么?我应该测试什么?如上所述,测试改造没有意义,因为它已经通过方形测试。滚动RecyclerView的测试工作没有意义,因为UI小部件RecyclerView已经在android框架内部进行了测试。

答案 1 :(得分:1)

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