techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Retrofit2のレスポンスをmockに置き換える Retrofit-Mock編

前回の記事では、MockWebServerを使用してサーバ自体をMockに置き換えた。
blog.techium.jp

今回はRetrofitMockにてResponseの内容をMock化する方法を使う。

build.gradleの修正

    // レスポンスのパースにgsonを使用
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    androidTestCompile 'com.squareup.retrofit2:retrofit-mock:2.1.0'

Retrofit-Mockでは、Retrofitでのレスポンスである、Responseオブジェクト自体をMockに置き換える。 サービスのインターフェースは前回使用したものと同じく、QiitaAPIにアクセスするものを使用する。

インターフェース

public interface IQiitaService {

    @GET("/api/v1/items")
    Call<ArrayList<Post>> getNewPosts();

}

Mock

上記インターフェースを実装するMockクラスを作成する
エラーのテストをしたい場合は、エラーテストのためのMockを用意する。

public class MockQiitaService implements IQiitaService {

    private final BehaviorDelegate<IQiitaService> mDelegate;

    public MockQiitaService(BehaviorDelegate<IQiitaService> delegate) {
        mDelegate = delegate;
    }


    @Override
    public Call<ArrayList<Post>> getNewPosts() {
        ArrayList<Post> ret = new ArrayList<>();
        // TODO: ここで必要なデータを作成する
        return mDelegate.returningResponse(ret).getNewPosts();
    }

}

テストクラス

public class ServiceMockAdapterTest extends InstrumentationTestCase {

    private MockRetrofit mMockRetrofit;
    private Retrofit mRetrofit;

    @Override
    public void setUp() throws Exception {
        super.setUp();
        mRetrofit = new Retrofit.Builder().baseUrl("https://qiita.com")
                .client(new OkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        NetworkBehavior behavior = NetworkBehavior.create();

        mMockRetrofit = new MockRetrofit.Builder(mRetrofit)
                .networkBehavior(behavior)
                .build();
    }

    public void testApiGetNewPosts() throws Exception {
        BehaviorDelegate<IQiitaService> delegate = mMockRetrofit.create(IQiitaService.class);
        IQiitaService mockQiitaService = new MockQiitaService(delegate);


        Call<ArrayList<Post>> posts = mockQiitaService.getNewPosts();
        Response<ArrayList<Post>> response = posts.execute();

        //Asserting response
        assertTrue(response.isSuccessful());
        ArrayList list = response.body();
        assertEquals(list.size(), 0);
    }
}

参考:

GitHub - square/retrofit: Type-safe HTTP client for Android and Java by Square, Inc.
Retrofit 2 - Mocking HTTP Responses - Riggaroo