AndroidでJUnit4を使う方法

**注意：（2014/12/23）Android SDKでJUnit4がサポートされるようになりました。このエントリーの一部は古くなっています。**

Android SDKでのサポートについてはこちらをどうぞ。
[続・AndroidでJUnit4を使う方法（Android SDKで正式サポートされました！）](http://qiita.com/AbeHaruhiko/items/91aa8fe0f2299969d0e7)
#### 執筆時点（2014/04/07）の環境、バージョン等

* AndroidStudio 0.5.4
* JUnit 4.11
* Android-JUnit4 0.3

#### eclipseの場合
http://d.hatena.ne.jp/esmasui/20120910/1347299594

## build.gradleの編集（JUnit4, Android-JUnit4のjar追加、TestRunnerの指定）

`build.gradle` に以下を追加する。

```groovy:build.gradle
android {
	defaultConfig {
		testInstrumentationRunner "com.uphyca.testing.JUnit4InstrumentationTestRunner"
	}

	dependencies {
		// 行末のバージョン指定（4.+ 等）は適宜変更
    	androidTestCompile ("junit:junit:4.+")
    	androidTestCompile ("com.uphyca:android-junit4:+")
	}

	// LICENS.txtがどうのこうのというエラーが出たら、他のjarと競合しているので下記の記述を追加。
	// パスはAndroidStudioの「Project」ペインでjarの中身を見て適宜変更。
	// （AndroidStudioのバグらしい）
    packagingOptions {
        // for AndroidStudio's bug. duplication error of file below.
        pickFirst 'META-INF/LICENSE.txt'
        pickFirst 'LICENSE.txt'
    }

}
```
追加後は、`Tools > Android > Sync Project with Gradle Files` （またはツールバーの`Sync Project with Gradle Files`アイコン![スクリーンショット 2014-04-08 0.03.29.png](https://qiita-image-store.s3.amazonaws.com/0/40758/1915049f-ffdb-b6c4-d369-08863aea97ff.png "スクリーンショット 2014-04-08 0.03.29.png")）を実行する。これによりMaven Centralからjarがダウンロードされる。

## AndroidManifest.xmlの編集

**アプリのAndroidManifest.xmlでなくテストコードのAndroidManifest.xmlなので注意。**
![スクリーンショット 2014-04-08 15.57.53.png](https://qiita-image-store.s3.amazonaws.com/0/40758/fb57170c-0b46-a964-f536-65d359361db1.png)


```xml:AndroidManifest.xml
<manifest>
	<!-- 下記以外は省略しています -->
	<instrumentation
        android:name="com.uphyca.testing.JUnit4InstrumentationTestRunner"
        android:targetPackage="your.app.package" />
</manifest>
```
**`build.gradle`のdefaultConfigで上書きされるので`android:name="com.uphyca.testing.JUnit4InstrumentationTestRunner"`は書かなくても動く模様。**


## Testクラスを作成する
例.AndroidUtilクラスのTestクラス

```java:AndroidUtilTest.java
import com.uphyca.testing.AndroidTestCase;	
import org.junit.Test;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

// テスト内容に応じて com.uphyca.testing 内の
// AndroiTestCase, ActivityTestCase 等を extends する
public class AndroidUtilTest extends AndroidTestCase {

	@Test	// @Testアノテーションでテストメソッドを指定。
	public void ほげメソッドがXXXを返すテスト() {
		// メソッド名をtestで始める必要なし。

	}
}
```

com.uphyca.testing内のTestCaseクラスを使用する以外は、通常のJUnit4の使用方法と同じ。

## JUnit3系のTestクラスをJUnit4用に書き換える例

### JUnit3.8用（抜粋）
```java:AndroidUtilTest.java
import android.test.AndroidTestCase;


// android.test.AndroidTestCase を extends
public class AndroidUtilTest extends AndroidTestCase {

	// メソッド名をtestで始める。
	public void test_checkメソッドがIllegalArgumentExceptionを送出する() {
        try {
            AndroidUtil.check(null);
        } catch (IllegalArgumentException e) {
            assertTrue(true);
        }
	}
}
```

### JUnit4用（抜粋）
```java:AndroidUtilTest.java
import com.uphyca.testing.AndroidTestCase;	
import org.junit.Test;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

// com.uphyca.testing.AndroidTestCase を extends
public class AndroidUtilTest extends AndroidTestCase {

    @Test(expected = IllegalArgumentException.class)
    public void checkの引数がnullの時IllegalArgumentExceptionが送出される() {
        AndroidUtil.check(null);
    }
}
```

## AndroidStudioで実行する設定

`Run > Edit Configurations...` （またはツールバー）の `specific instrumentation runner(optional): ` に `com.uphyca.testing.JUnit4InstrumentationTestRunner` を指定する。

![スクリーンショット 2014-04-08 0.01.44.png](https://qiita-image-store.s3.amazonaws.com/0/40758/92e84921-c7eb-237a-d429-bc1f531cb885.png "スクリーンショット 2014-04-08 0.01.44.png")

![スクリーンショット 2014-04-07 23.55.45.png](https://qiita-image-store.s3.amazonaws.com/0/40758/8434903f-12b5-b986-7d0f-addebe58b520.png "スクリーンショット 2014-04-07 23.55.45.png")

## AndroidStudioでテスト実行

ツールバーの `Run` アイコン等から実行。