前回の記事では、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