JUnit4
https://github.com/googlesamples/android-testing/tree/master/runner/AndroidJunitRunnerSampleにサンプルがあります。
具体的には CalculatorAddParameterizedTest.java がテストクラスで、
テスト対象のクラスは Calculator.java です。
上記のサンプルを見ればだいたいわかるのですが、Kotlinで書いた以下のFizzBazzをテストしてみたいと思います。
class FizzBazz {
fun fizzbazz(value: Int): String {
return when {
value % 15 == 0 -> "fizzbazz"
value % 3 == 0 -> "fizz"
value % 5 == 0 -> "bazz"
else -> value.toString()
}
}
}
- 1. テストクラスに @RunWith アノテーションで Parameterized を指定する。
- 2. Parameterized テストで使う値をコンストラクタの引数として受け取り保持する。
- 3. @Parameters アノテーションをつけた static メソッドを用意する(つまり @JvmStatic が必要)。このメソッドではコンストラクタ引数に対応した値の配列のIterableを返す。
- 4. 保持した値を使ってテストする。
/**
* @RunWith で Parameterized を指定する
*
* Parameterized テストで使う値をコンストラクタの引数として受け取る
* ここでは fizzbazz() に渡す値と、fizzbazz()の戻り値の期待値の2つを引数として受け取る
*/
@RunWith(Parameterized::class)
class FizzBazzParameterizedTest(
private val value: Int,
private val expected: String
) {
private lateinit var fizzBazz: FizzBazz
@Before
fun setUp() {
fizzBazz = FizzBazz()
}
@Test
fun testFizzBazz() {
assertThat(fizzBazz.fizzbazz(value)).isEqualTo(expected)
}
companion object {
/**
* @Parameters と @JvmStatic をつける
* @return [Iterable] コンストラクタに渡す値のIterableを返す
*/
@Parameters
@JvmStatic
fun data(): Iterable<Array<Any>> {
return listOf(
arrayOf(1, "1"),
arrayOf(2, "2"),
arrayOf(3, "fizz"),
arrayOf(4, "4"),
arrayOf(5, "bazz"),
arrayOf(15, "fizzbazz")
)
}
}
}
テスト結果
Robolectric
BlockJUnit4ClassRunnerWithParameters を継承した Runner であれば、@Parameterized.UseParametersRunnerFactory でその Runner を返す ParametersRunnerFactory を指定することで、その Runner で Parameterized テストを実行することができます。RobolectricTestRunner は SandboxTestRunner を継承しているためこの方法は使えません。 代わりに Robolectric には ParameterizedRobolectricTestRunner が用意されています。
TextUtils を使った次の EmptyChecker をテストしてみます。
class EmptyChecker {
fun isEmpty(value: String?): Boolean {
return TextUtils.isEmpty(value)
}
}
使い方は Parameterized とほぼ同じです。違いは @RunWith に ParameterizedRobolectricTestRunner を指定することと、@ParameterizedRobolectricTestRunner.Parameters を使うことです。
/**
* @RunWith で ParameterizedRobolectricTestRunner を指定する
*
* Parameterized テストで使う値をコンストラクタの引数として受け取る
* ここでは isEmpty() に渡す値と、isEmpty()の戻り値の期待値の2つを引数として受け取る
*/
@RunWith(ParameterizedRobolectricTestRunner::class)
class EmptyCheckerParameterizedTest(
private val value: String?,
private val expected: Boolean
) {
private lateinit var emptyChecker: EmptyChecker
@Before
fun setUp() {
emptyChecker = EmptyChecker()
}
@Test
fun testFizzBazz() {
assertThat(emptyChecker.isEmpty(value)).isEqualTo(expected)
}
companion object {
/**
* @ParameterizedRobolectricTestRunner.Parameters と @JvmStatic をつける
* @return [Iterable] コンストラクタに渡す値のIterableを返す
*/
@ParameterizedRobolectricTestRunner.Parameters
@JvmStatic
fun data(): Iterable<Array<Any?>> {
return listOf(
arrayOf<Any?>(null, true),
arrayOf<Any?>("", true),
arrayOf<Any?>("a", false)
)
}
}
}
テスト結果
0 件のコメント:
コメントを投稿