あんまり見ないでください

プログラミング・技術関連,アイディア,気づいたことなどを低レベルで垂れ流す場所.

プロキシ環境下でRobolectricを導入する

AndroidアプリのユニットテストでContextやandroid.jarのクラスを使ったメソッドのテストを書くときに、Robolectricを使えばAndroidTestよりも高速でテストできるという情報を得たので導入してみました。この記事では、プロキシ環境下でRobolectricを導入する手順を説明します。

目標

Robolectricのサンプル
robolectric/robolectric-samples · GitHub
ユニットテストをプロキシ環境下で実施する。

環境

導入手順

サンプルプロジェクトをインポート

robolectric/robolectric-samples · GitHub

でサンプルプロジェクトのZipファイルをダウンロードします(もちろん、gitでクローンしてもいいです)。ダウンロードしてきたら、AndroidStudioでプロジェクトをインポートします。

ユニットテストを実行できるようにする

  1. Run -> Edit Configurations... で、Run/Debug Configurationsの設定画面を出す。
  2. 左上の「+」ボタンを押すとAdd New Configurationというのが出てくるので、JUnitを選択する。
  3. Nameはなんでもよい
  4. Use class path of mod... は、テストしたいapiのもの(android-api-21とか)。
  5. Test KindはAll in packageでcomを指定すれば、パッケージがcomで始まるクラスが全てテストできる。(All in Directoryとかでもいいかもしれない)

プロキシ環境下でない場合は、ここでRunボタン(再生ボタンみたいなやつ)の左のセレクトボックスで追加したJunitのConfigurationを選択して実行すれば、動作するはずです。しかし、プロキシ環境下の場合はMavenリポジトリからライブラリをダウンロードするときに上手くいきません。

~/.m2/settings.xml を追加する

Mavenのプロキシ設定は、

<ユーザディレクトリ>/.m2/settings.xml

に記述します。.m2ディレクトリがない場合はコマンドラインのmkdirで作成するなどしてください。settings.xmlに以下のような記述をします。

<proxies>
  <proxy>
    <active>true</active>
    <protocol>http</protocol>
    <host>proxy.somewhere.com</host>
    <port>8080</port>
    <username>proxyuser</username>
    <password>somepassword</password>
    <nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts>
  </proxy>
</proxies>

自分のプロキシ環境のホスト名やポート番号、自分のユーザ名とパスワードを記述してください。
参考:setting.xml解説

テストを実行する

  1. Build Variants(Android Studioの左サイドの下の方)をクリックし、Test ArtifactのセレクトボックスをUnit Testに変更
  2. Runボタン(再生ボタンみたいなやつ)の左のセレクトボックスで追加したJunitのConfigurationを選択して実行

Mavenリポジトリからライブラリをダウンロードする際に、[WARNING]が出るが気にしない。ダウンロードに時間がかかるが初回だけなので気にしない。

説明は以上です。

おまけ:自分のプロジェクトにRobolectricを導入する

自分のプロジェクトに導入する際は、

dependencies {
    testCompile "junit:junit:4.10"
    testCompile "org.robolectric:robolectric:3.0"
}

をappのbuild.gradeに記述して上記の導入手順を実施すれば、Contextやandroid.jarのクラスを使えるようになる。

感想

gitのプロキシ設定、Android Studioのプロキシ設定をして、もうプロキシ設定はいいやと思っていたところに、この問題が出てきたので「うげぇぇ!」と思いました。あと、Mavenリポジトリからライブラリをダウンロードする際、どうやら何かのアクセスでタイムアウトになり[WARNING]を出してからsettings.xmlを読んでプロキシ経由のアクセスをしている(ように見える)ので、ダウンロードに時間がかかっているのではと思いました。どうにかなりませんかね。