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