読者です 読者をやめる 読者になる 読者になる

spring of life

技術、ときどき日常のブログ(予定)

Android + Mockito でテスト

また家計簿のアプリの話で、WebAPIを実行する時に使うHTTPクライアントのテストをする時にモックを使ってみた

インストール

下記のページを参考にjarを3つlibsに追加

y-anz-m.blogspot.jp

ただ、記事がちょっと古くて?dexmakerとかのダウンロードページへのリンク先が404なので、こちらからダウンロード

あとは、ダウンロードしたjarをlibsの下に入れてビルドパスの設定したら完了!

使い方

↓みたいな感じでモックを作成するメソッドを作ってみた

private void setupMock(HTTPClient httpClient, int statusCode, final String responseBody) {
  try {
    when(con.getResponseCode()).thenReturn(statusCode);
    when(con.getInputStream()).thenReturn(new InputStream() {
      private int position = 0;
      @Override
      public int read() throws IOException {
        return position < responseBody.length() ? responseBody.charAt(position++) : -1;
      }

      @Override
      public void close() throws IOException {}
    });

    Class<? extends HTTPClient> c = httpClient.getClass();
    Field f = c.getDeclaredField("con");
    f.setAccessible(true);
    f.set(httpClient, con);
  } catch (NoSuchFieldException e) {
    e.printStackTrace();
  } catch (IllegalArgumentException e) {
    e.printStackTrace();
  } catch (IllegalAccessException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

conHttpURLConnectionクラスのインスタンスで、HTTPClientがフィールドとして持ってるので、それをモックに差し替える感じ

で、connect()を実行した時に接続して欲しくないので、

@Before
public void setUp() throws Exception {
  super.setUp();
  System.setProperty("dexmaker.dexcache", getContext().getCacheDir().getPath());
  con = mock(HttpURLConnection.class);
  doNothing().when(con).connect();
}

みたいに、doNothing()を使って文字通り何もしないように事前に設定しておく

あと、android で mockito を使う場合はプロパティ設定が必要らしい(自分の場合は下記記事のパターン2が必要だった)

qiita.com