LoginSignup
5
3

More than 5 years have passed since last update.

EspressoでテストするときにApplicationクラスを入れ替える

Posted at

Applicationクラス

アプリ起動時に1度だけ処理を実行させたり、アクティビティ間でデータをグローバルに共有したい時にApplicationクラスを拡張しますよね。テスト実行時にApplicationクラスを差し替える方法を紹介します。

まずはApplicationクラスを拡張します。

NormalApplication.java

import android.app.Application;

public class NormalApplication extends Application {
}

manifestにNormalApplicationを指定

manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.co.hoge.test">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        //ここにNormalApplicationを指定
        android:name=".NormalApplication"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String message = ((NormalApplication)getApplication()).getClass().getSimpleName();
        TextView tv = (TextView)findViewById(R.id.message);
        tv.setText(message);
    }
}

res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

ビルド

applicationクラスはNormalApplicationになっています。

Screenshot_20170117-134529_png.png

Espressoでテスト

MainActivityTest.java

import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withText;

@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
    @Rule
    public ActivityTestRule<MainActivity> mActivityRule
            = new ActivityTestRule(MainActivity.class);

    @Test
    public void 画面に表示されているクラス名の確認() {    
         onView(withId(R.id.message)).check(matches(withText("TestApplication")));
    }
}

テスト結果

画面にはTestApplicationではなくNormalApplicationと表示されているはずなので当然エラーになります。

TestApplicationクラスを作ります。

TestApplication.java

public class TestApplication extends NormalApplication {
}

テスト実行の際にTestApplicationに差し替えるためRunnerを変更します。

MyTestRunner.java

import android.app.Application;
import android.content.Context;
import android.support.test.runner.AndroidJUnitRunner;

public class MyTestRunner extends AndroidJUnitRunner {
  @Override
  public Application newApplication(ClassLoader cl, String className, Context context)
      throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    return super.newApplication(cl, TestApplication.class.getName(), context);
  }
}


Runnerを変更

build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "jp.co.hoge.test"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        // ここを修正
        testInstrumentationRunner "jp.co.hoge.test.MyTestRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
}

Edit Configurations

スクリーンショット_2017-01-17_13_55_03.png

Run_Debug_Configurations_と_app_-_Test_-____Desktop_Test_.png

テスト成功

テスト実行時はTestApplicationが呼ばれました!

5
3
2

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
5
3