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

# Eclipseからインポートする前のフォルダ構成
```text:root/
a_project/
b_project/
c_project/
...
```
```text:a_project/
AndroidManifest.xml
assets/
libs/
project.properties
res/
src/
```
b_project, c_project ... も同様の構成とする
# Eclipseにてbuild.gradle生成
```groovy:build.gradle
buildscript {
    repositories { mavenCentral() }
    dependencies { classpath 'com.android.tools.build:gradle:1.+' }
}

allprojects { repositories { jcenter() } }
```
```groovy: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に追加するものとして

```java: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ファイルを書き換える。

```groovy: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() } }
```

```groovy: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に追加するものとして

```java: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を生成してテストしたりできる！