JUnit5の特徴の一つとして、
- static でない内部クラスをネストすることができる。
これを利用して内部クラスをコンテキストごとに分け、共通の前提条件を外部のクラスに記述できる。 - Parameterizedテストを書きやすい
という記述を見かけ、下記のようなテストクラスを作成しました。
TestCaseAクラスは内部クラスContextAで使用されるパラメータクラス、
TestCaseBクラスは内部クラスContextBで使用されるパラメータクラスとします。
テストメソッドは内部クラスにありますが、それが使用するパラメータは外側のクラスに定義されているためより近い位置に記述したいと考えています。
しかし、パラメータクラスを内部クラスの内側に移動しようとすると、innerクラス内なのでstaticクラスとしては実装できず、かと言って非staticクラスとして実装するとstaticクラスである必要があるというエラーが出ます。
パラメータクラスを非staticクラスとしてエラーを回避する方法はあるのでしょうか。
もしくは、考え方が間違っていて各内部クラスに同様のパラメータクラスを使用するメソッドを実装すべきなのでしょうか。
しかし、前提条件等が変われば期待する結果も変わってくるので使い回すことはできないようにも思います。
アドバイスをお願いいたします。
Kotlin
1internal class TestClass { 2 lateinit var testTarget: TestTargetClass 3 4 lateinit var mockRepository: RepositoryClass 5 6 @BeforeEach 7 fun setUp() { 8 } 9 10 private class TestCaseA : ArgumentsProvider { 11 override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> = Stream.of( 12 Arguments.arguments(/*テスト用のパラメータと期待する結果を生成*/) 13 ) 14 } 15 16 private class TestCaseB : ArgumentsProvider { 17 override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> = Stream.of( 18 Arguments.arguments(/*テスト用のパラメータと期待する結果を生成*/) 19 ) 20 } 21 22 @Nested 23 inner class ContextA { 24 25 @BeforeEach 26 fun setUp() { 27 mockRepository = mock { 28 //Mock処理 29 } 30 testTarget = TestTargetClass(mockRepository) 31 } 32 33 @ParameterizedTest 34 @ArgumentsSource(TestCaseA::class) 35 fun TestA(source: Int, result: Int) { 36 37 //AssertJでテスト 38 Assertions.assertThat(taetTarget.testMethod) 39 } 40 } 41 //以下ContextB,ContextC~ 42}
あなたの回答
tips
プレビュー