コンテキスト設定の継承

@ContextConfiguration は、ブール型 inheritLocations および inheritInitializers 属性をサポートします。これらの属性は、リソースの場所またはコンポーネントクラス、およびスーパークラスによって宣言されたコンテキスト初期化子を継承する必要があるかどうかを示します。両方のフラグのデフォルト値は true です。つまり、テストクラスは、リソースの場所またはコンポーネントクラス、およびスーパークラスによって宣言されたコンテキスト初期化子を継承します。具体的には、テストクラスのリソースの場所またはコンポーネントクラスは、スーパークラスによって宣言されたリソースの場所またはアノテーション付きクラスのリストに追加されます。同様に、特定のテストクラスの初期化子は、テストスーパークラスによって定義された初期化子のセットに追加されます。サブクラスには、リソースの場所、コンポーネントクラス、コンテキスト初期化子を継承するオプションがあります。

@ContextConfiguration の inheritLocations または inheritInitializers 属性が false に設定されている場合、テストクラスシャドウのリソースの場所またはコンポーネントクラスとコンテキスト初期化子はそれぞれ、スーパークラスによって定義された構成を効果的に置き換えます。

Spring Framework 5.3 以降、テスト構成は、囲んでいるクラスから継承することもできます。詳細については、@Nested テストクラスの構成を参照してください。

XML リソースの場所を使用する次の例では、ExtendedTest の ApplicationContext が base-config.xml および extended-config.xml からこの順序でロードされます。extended-config.xml で定義された Bean は、base-config.xml で定義された Bean をオーバーライド(つまり、置換)できます。次の例は、あるクラスが別のクラスを継承し、独自の構成ファイルとスーパークラスの構成ファイルの両方を使用する方法を示しています。

  • Java

  • Kotlin

@ExtendWith(SpringExtension.class)
// ApplicationContext will be loaded from "/base-config.xml"
// in the root of the classpath
@ContextConfiguration("/base-config.xml") (1)
class BaseTest {
	// class body...
}

// ApplicationContext will be loaded from "/base-config.xml" and
// "/extended-config.xml" in the root of the classpath
@ContextConfiguration("/extended-config.xml") (2)
class ExtendedTest extends BaseTest {
	// class body...
}
1 スーパークラスで定義された構成ファイル。
2 サブクラスで定義された構成ファイル。
@ExtendWith(SpringExtension::class)
// ApplicationContext will be loaded from "/base-config.xml"
// in the root of the classpath
@ContextConfiguration("/base-config.xml") (1)
open class BaseTest {
	// class body...
}

// ApplicationContext will be loaded from "/base-config.xml" and
// "/extended-config.xml" in the root of the classpath
@ContextConfiguration("/extended-config.xml") (2)
class ExtendedTest : BaseTest() {
	// class body...
}
1 スーパークラスで定義された構成ファイル。
2 サブクラスで定義された構成ファイル。

同様に、コンポーネントクラスを使用する次の例では、ExtendedTest の ApplicationContext が BaseConfig クラスと ExtendedConfig クラスからこの順序でロードされます。ExtendedConfig で定義された Bean は、BaseConfig で定義された Bean をオーバーライド(つまり、置換)できます。次の例は、あるクラスが別のクラスを継承し、独自の構成クラスとスーパークラスの構成クラスの両方を使用する方法を示しています。

  • Java

  • Kotlin

// ApplicationContext will be loaded from BaseConfig
@SpringJUnitConfig(BaseConfig.class) (1)
class BaseTest {
	// class body...
}

// ApplicationContext will be loaded from BaseConfig and ExtendedConfig
@SpringJUnitConfig(ExtendedConfig.class) (2)
class ExtendedTest extends BaseTest {
	// class body...
}
1 スーパークラスで定義された構成クラス。
2 サブクラスで定義された構成クラス。
// ApplicationContext will be loaded from BaseConfig
@SpringJUnitConfig(BaseConfig::class) (1)
open class BaseTest {
	// class body...
}

// ApplicationContext will be loaded from BaseConfig and ExtendedConfig
@SpringJUnitConfig(ExtendedConfig::class) (2)
class ExtendedTest : BaseTest() {
	// class body...
}
1 スーパークラスで定義された構成クラス。
2 サブクラスで定義された構成クラス。

コンテキスト初期化子を使用する次の例では、ExtendedTest の ApplicationContext は BaseInitializer および ExtendedInitializer を使用して初期化されます。ただし、イニシャライザーが呼び出される順序は、Spring の Ordered インターフェースを実装するか、Spring の @Order アノテーションまたは標準 @Priority アノテーションが付けられているかによって異なります。次の例は、あるクラスが別のクラスを継承し、独自の初期化子とスーパークラスの初期化子の両方を使用する方法を示しています。

  • Java

  • Kotlin

// ApplicationContext will be initialized by BaseInitializer
@SpringJUnitConfig(initializers = BaseInitializer.class) (1)
class BaseTest {
	// class body...
}

// ApplicationContext will be initialized by BaseInitializer
// and ExtendedInitializer
@SpringJUnitConfig(initializers = ExtendedInitializer.class) (2)
class ExtendedTest extends BaseTest {
	// class body...
}
1 スーパークラスで定義された初期化子。
2 サブクラスで定義された初期化子。
// ApplicationContext will be initialized by BaseInitializer
@SpringJUnitConfig(initializers = [BaseInitializer::class]) (1)
open class BaseTest {
	// class body...
}

// ApplicationContext will be initialized by BaseInitializer
// and ExtendedInitializer
@SpringJUnitConfig(initializers = [ExtendedInitializer::class]) (2)
class ExtendedTest : BaseTest() {
	// class body...
}
1 スーパークラスで定義された初期化子。
2 サブクラスで定義された初期化子。