LoginSignup
3
3

More than 5 years have passed since last update.

Eclipseからgradle(Android Studio)に移行したプロジェクトにrobolectricを用いた単体テストを実装する

Posted at

Eclipseからインポートする前のフォルダ構成

root/
a_project/
b_project/
c_project/
...
a_project/
AndroidManifest.xml
assets/
libs/
project.properties
res/
src/

b_project, c_project ... も同様の構成とする

Eclipseにてbuild.gradle生成

build.gradle
buildscript {
    repositories { mavenCentral() }
    dependencies { classpath 'com.android.tools.build:gradle:1.+' }
}

allprojects { repositories { jcenter() } }
a_project/build.gradle
apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':b_project')
    compile project(':c_project')
    ...
}

android {
    compileSdkVersion 18
    buildToolsVersion "21.1.2"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    lintOptions { abortOnError false }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'LICENSE.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
}

b_project/build.gradle, c_project/build.gradleも同様。ただし、dependenciesのcompile projectは必要な参照プロジェクトに書き換える。
この時点で
gradle build
が通ることを確認する。

単体テストを追加する

a_projectに追加するものとして

a_project/tests/java/com/example/SampleTest.java
package com.example;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class SampleTest {
    @Before public void setup() { // setup }
    @After public void teardown() { // teardown }
    @Test public void sampleFunctionTest() { Assert.fail(); }
}

と単体テストを記述し、以下のbuild.gradleファイルを書き換える。

build.gradle
buildscript {
    repositories { mavenCentral() }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.+'
        classpath 'org.robolectric:robolectric-gradle-plugin:0.+' // <- robolectric-gradle-pluginを追加する
    }
}

allprojects { repositories { jcenter() } }
a_project/build.gradle
apply plugin: 'android'
apply plugin: 'robolectric' // <- robolectricのプラグインを追加する

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':b_project')
    compile project(':c_project')
    ...
    androidTestCompile('junit:junit:4.+') // <- junitへの参照を追加
    androidTestCompile('org.robolectric:robolectric:2.+') // <- robolectricへの参照を追加
}

android {
    compileSdkVersion 19
    buildToolsVersion "21.1.2"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        androidTest.setRoot('tests') // <- testsフォルダをandroidTestのルートフォルダに指定する(デフォルトではsrc/testが設定されているので変更した)

        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    lintOptions { abortOnError false }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'LICENSE.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
}

この時点で
gradle test
を実行すると先ほど記述した1件のテストが実行され、必ずfailするように書いたので、失敗した趣旨が表示されることを確認する。Assert.fail()をコメントアウトするなりすれば、1件のテストが通るようになる。

Robolectricを使用した単体テストを追加する

a_projectに追加するものとして

a_project/tests/java/com/example/SampleActivityTest.java
package com.example;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

@RunWith(RobolectricTestRunner.class)
@Config(emulateSdk = 18)
public class SampleTest {
    @Before public void setup() { // setup }
    @After public void teardown() { // teardown }
    @Test public void sampleFunctionTest() {
        Activity activity = Robolectric.buildActivity(SampleActivity.class).create().get();
        assertFalse(activity.hasDone());
        activity.doSomething();
        assertTrue(activity.hasDone());
    }
}

というふうに、activityを生成してテストしたりできる!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3