🧪
同じテストを複数の設定で起動させるテストコードを3分クッキング
前提
- SpringBoot
- kotlin
- JUnit
やりたいこと
テストコードの中身は全く同じだが、複数の設定(振る舞いを制御する設定)でテストを実行させたい
制約
同じ内容のテストコードを複数コピペで用意するのはメンテナンスコストを鑑みて避けたい
3分クッキング
今回は一つのやり方として、テストコードを基底クラスに集約し実装クラス側で設定を行うことでテストコードは一つとしたまま、複数の設定でテストを可能にしたいと思います。
@Import(ConfigA::class)
internal class ConfigPatternA(testComponent: TestComponent) : AbstractTest(testComponent)
@Import(ConfigB::class)
internal class ConfigPatternB(testComponent: TestComponent) : AbstractTest(testComponent)
@SpringBootTest
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
internal abstract class AbstractTest(
private val testComponent: TestComponent
) {
@Test
fun test() {
val actual = testComponent.test()
assertEquals("test", actual)
}
}
まとめ
具象クラスごとにテストコードが実行されます。
これでテストコードは単一をキープしたまま複数の設定状況でのテストが可能になります。
実装継承を必要とするので多用は禁物ですでが(完全に全く同じ内容のテストを複数の設定で実行したいようなケースでのみ真価を発揮できる手法)一つの選択肢として知っておくと役立つことがあるかもしれません。
Discussion