この記事の内容
AndroidTestとUniteTestの両方で、assetsにあるファイルにアクセスする方法です。
AndroidTestは、androidx.testを、UnitTestは、Robolectricをそれぞれ使用します。
androidx.testのセットアップに関しては公式をご覧ください。
dependencies
テストの依存関係は以下の通りです。
app/build.gradle
dependencies {
// For test
testImplementation("junit:junit:4.13.2")
testImplementation("org.robolectric:robolectric:4.9")
// For android test
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("androidx.compose.ui:ui-test-junit4:$composeVersion")
}
AndroidTestで「src/androidTest/assets」にアクセスする
「InstrumentationRegistry.getInstrumentation().context」を使用します。
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Test
import org.junit.runner.RunWith
import java.io.InputStreamReader
@RunWith(AndroidJUnit4::class) // JUnit3とJUnit4が混在しているテストの時は必要です。
@LargeTest // 1秒以上かかるようなテストの場合必要です。
class SampleAndroidTest {
@Test
fun sample_1() {
// 「src/androidTest/assets」にアクセスするためのコンテキストの取得方法
val context = InstrumentationRegistry.getInstrumentation().context
// 「src/main/assets」にアクセスするためのコンテキストの取得方法
// val context: Context = ApplicationProvider.getApplicationContext()
InputStreamReader(context.assets.open("sample_1.html")).use { reader ->
println(reader.readText())
}
}
}
「@RunWith(AndroidJUnit4::class)」は、JUnit3とJUnit4が混在しているテストの時は必要になります。
「@LargeTest」は、1秒以上かかるようなテストの場合につけます。
UnitTestで「src/test/assets」にアクセスする
@Config(assetDir = "src/test/assets")を指定します。
import android.content.Context
import org.junit.Assert.*
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config
import java.io.InputStreamReader
@RunWith(RobolectricTestRunner::class)
@Config(assetDir = "src/test/assets")
class SampleUnitTest {
@Test
fun `sample 1`() {
val context: Context = RuntimeEnvironment.getApplication()
InputStreamReader(context.assets.open("sample_1.html")).use { reader ->
println(reader.readText())
}
}
}