- Android Studio 4.0.1
- Kotlin: 1.3.72
- robolectric:4.3
- Windows 10
Androidアプリ開発でUnitTestをします。
出来る限り実機やエミュレータを使わず、JavaVM上で動かしサクサクテストできるような環境を目指します。
テストケースの種類
InstrumentedTest
- app/src/androidTest
- 実機もしくはエミュレータ上で実行される
- ExampleInstrumentedTest.ktというサンプルが作られる
- 今回は、こちらはできるだけ使用しない方針です。
UnitTest
- app/src/test
- PCのJavaVM上で実行される
- ExampleUnitTest.ktというサンプルが作られる
- 今回はこちらをメインで使用していきます。
テストケース実行
- Android Studio にて該当のパッケージ、クラス、メソッドで右クリック→ Run Testsで実行できる
テストケース作成
- 該当の
パッケージ名(androidTest)
もしくはパッケージ名(test)
にクラスを作成 - 実行するテストメソッドに@Testをつけます
package jp.co.sankosc.sample
import org.junit.Assert.*
import org.junit.Test
class SampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}
robolectricの準備
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
dependencies {
testImplementation 'org.robolectric:robolectric:4.3'
}
sdk=29では動かなかったため、robolectricをskd=28で実行するよう設定します。
app/src/test/resources/[パッケージ] にrobolectric.propertiesファイルを作成します
sdk=28
Activityのテスト
package jp.co.sankosc.sample
import android.widget.TextView
import org.junit.Assert
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
@RunWith(RobolectricTestRunner::class)
class SampleUnitTest {
@Test
fun testActivity() {
val activity:MainActivity = Robolectric.buildActivity(MainActivity::class.java).setup().get()
val text = activity.findViewById<TextView>(R.id.textView).text
Assert.assertEquals("Hello World!", text)
}
}
Realmについて
いろいろ試行錯誤しましたが、RealmをRobolectric使ってUnitTestで動かすことはできませんでした。RealmのテストはInstrumentedTestの方でやるしかなさそうです。
また、Realmを使ったアプリを作っているとUnitTestが動かなくなる場合があります。
Realmの初期化を、Applicationクラスで行っている場合で、この場合はテストのときはApplicationクラスでRealmの初期化をしないようにしておく必要があります。
何もしないApplicationクラスを作る
package jp.co.sankosc.sample
import android.app.Application
class AppUnitTest : Application()
robolectric.propertiesでRobolectricのApplicationクラスを指定する
sdk=28
application=jp.co.sankosc.sample.AppUnitTest
Realmの準備はこちらをご参照ください:Android,KotlinでRealm