Edited at

AndroidでJUnit4を使う方法

More than 3 years have passed since last update.

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

Android SDKでのサポートについてはこちらをどうぞ。

続・AndroidでJUnit4を使う方法(Android SDKで正式サポートされました!)


執筆時点(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 に以下を追加する。


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アイコン

)を実行する。これによりMaven Centralからjarがダウンロードされる。


AndroidManifest.xmlの編集

アプリのAndroidManifest.xmlでなくテストコードのAndroidManifest.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クラス


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用(抜粋)


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用(抜粋)


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 を指定する。


AndroidStudioでテスト実行

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