アノテーションインターフェース TestPropertySource
@TestPropertySource は、統合テスト用に ApplicationContext の Environment の PropertySources のセットに追加されるプロパティファイルの locations() およびインライン化された properties() を構成するために使用されるクラスレベルのアノテーションです。優先順位
テストプロパティソースは、オペレーティングシステムの環境または Java システムプロパティからロードされたものよりも優先度が高く、アプリケーションによって宣言的に @PropertySource を介して、またはプログラムによって(たとえば、ApplicationContextInitializer またはその他の手段を介して)追加されたプロパティソースも同じです。テストプロパティソースを使用して、システムおよびアプリケーションプロパティソースで定義されたプロパティを選択的にオーバーライドできます。さらに、インライン化された properties() は、リソース locations() からロードされたプロパティよりも優先されます。ただし、@DynamicPropertySource を介して登録されたプロパティは、@TestPropertySource を介してロードされたプロパティよりも優先されることに注意してください。
デフォルトのプロパティファイルの検出
@TestPropertySource が空のアノテーションとして宣言されている場合(つまり、locations() または properties() の明示的な値がない場合)、アノテーションを宣言したクラスに関連するデフォルトのプロパティファイルを検出しようとします。例: アノテーション付きテストクラスが com.example.MyTest の場合、対応するデフォルトプロパティファイルは "classpath:com/example/MyTest.properties" です。デフォルトを検出できない場合、IllegalStateExceptionSE がスローされます。
@ TestPropertySource の有効化
@TestPropertySource は、設定されたコンテキストローダーがそれを尊重する場合に有効になります。AbstractGenericContextLoader または AbstractGenericWebContextLoader のサブクラスであるすべての SmartContextLoader は、@TestPropertySource の自動サポートを提供します。これには、Spring TestContext フレームワークによって提供されるすべての SmartContextLoader が含まれます。
その他
- 通常、
@TestPropertySourceは@ContextConfigurationと組み合わせて使用されます。 @TestPropertySourceは、繰り返し可能なSEアノテーションとして使用できます。- このアノテーションは、カスタム構成アノテーションを作成するためのメタアノテーションとして使用することができます。ただし、両方のアノテーションの
locationsおよびinheritLocations属性は属性解決プロセス中にあいまいさを引き起こす可能性があるため、このアノテーションと@ContextConfigurationを合成アノテーションで組み合わせる場合は注意が必要です。 - Spring Framework 5.3 以降、このアノテーションはデフォルトでそれを囲むテストクラスから継承されます。詳細については、
@NestedTestConfigurationを参照してください。
- 導入:
- 4.1
- 作成者:
- Sam Brannen
- 関連事項:
オプション要素の概要
オプション要素修飾子と型オプションの要素説明booleanスーパークラスおよびそれを囲むクラスからのテストプロパティソースlocations()を継承する必要があるかどうか。booleanスーパークラスおよびそれを囲むクラスからのインラインテストproperties()を継承する必要があるかどうか。StringSE[]EnvironmentのPropertySourcesのセットにロードされるプロパティファイルのリソースの場所。StringSE[]ApplicationContextがテスト用にロードされる前に SpringEnvironmentに追加する必要があるキーと値のペアの形式のインラインプロパティ。StringSE[]locations()のエイリアス。
要素の詳細
value
locations()のエイリアス。この属性は、
locations()と組み合わせて使用することはできませんが、locations()の代わりに使用することができます。- 関連事項:
- デフォルト:
- {}
locations
EnvironmentのPropertySourcesのセットにロードされるプロパティファイルのリソースの場所。各場所は、宣言された順序で、自身のプロパティソースとして、包含Environmentに追加されます。Supported File Formats
従来のプロパティファイル形式と XML ベースのプロパティファイル形式の両方がサポートされています。— たとえば、
"classpath:/com/example/test.properties"または"file:/path/to/file.xml"。Path Resource Semantics
各パスは Spring
Resourceとして解釈されます。プレーンパス(たとえば、"test.properties")は、テストクラスが定義されているパッケージに関連するクラスパスリソースとして扱われます。スラッシュで始まるパスは、絶対クラスパスリソースとして扱われます(例:"/org/example/test.xml")。URL を参照するパス(たとえば、接頭辞classpath:、file:、http:など)は、指定されたリソースプロトコルを使用してロードされます。リソースの場所のワイルドカード(**/*.propertiesなど)は許可されていません。各場所は、正確に 1 つの.propertiesまたは.xmlリソースに評価される必要があります。パス内のプロパティプレースホルダー(つまり、${...})はEnvironmentに対して解決されます。Default Properties File Detection
デフォルトの検出については、クラスレベルの Javadoc を参照してください。
Precedence
リソースの場所から読み込まれたプロパティは、インライン
properties()よりも優先順位が低くなります。この属性は、
value()と組み合わせて使用することはできませんが、value()の代わりに使用することができます。- デフォルト:
- {}
inheritLocations
boolean inheritLocationsスーパークラスおよびそれを囲むクラスからのテストプロパティソースlocations()を継承する必要があるかどうか。デフォルト値は
trueです。これは、テストクラスがスーパークラスまたはそれを囲むクラスによって定義されたプロパティソースの場所を継承することを意味します。具体的には、テストクラスのプロパティソースの場所は、スーパークラスまたはそれを囲むクラスによって定義されたプロパティソースの場所のリストに追加されます。サブクラスとネストされたクラスには、テストプロパティのソースの場所のリストを拡張するオプションがあります。inheritLocationsがfalseに設定されている場合、テストクラスのプロパティソースの場所はシャドウされ、スーパークラスまたはそれを囲むクラスによって定義されたプロパティソースの場所を効果的に置き換えます。次の例では、
BaseTestのApplicationContextは、"base.properties"ファイルのみをテストプロパティソースとして使用してロードされます。対照的に、ExtendedTestのApplicationContextは、"base.properties"および"extended.properties"ファイルをテストプロパティソースの場所として使用してロードされます。@TestPropertySource("base.properties") @ContextConfiguration public class BaseTest { // ... } @TestPropertySource("extended.properties") @ContextConfiguration public class ExtendedTest extends BaseTest { // ... }@TestPropertySourceが繰り返し可能なSEアノテーションとして使用される場合、次の特別な規則が適用されます。- スーパークラスから継承される
@TestPropertySourceアノテーションとは対照的に、テストクラス階層の特定のレベル(つまり、テストクラスに直接存在するかメタ存在する)のすべての@TestPropertySourceアノテーションは、ローカルアノテーションと見なされます。 - すべてのローカル
@TestPropertySourceアノテーションは、inheritLocationsフラグに同じ値を宣言する必要があります。 inheritLocationsフラグは、ローカル@TestPropertySourceアノテーション間では考慮されません。具体的には、1 つのローカルアノテーションのプロパティソースの場所が、以前のローカルアノテーションで定義されたプロパティソースの場所のリストに追加されます。これにより、ローカルアノテーションがテストプロパティソースの場所のリストを継承し、個々のプロパティをオーバーライドする可能性があります。
- 関連事項:
- デフォルト:
- true
- スーパークラスから継承される
properties
StringSE[] propertiesApplicationContextがテスト用にロードされる前に SpringEnvironmentに追加する必要があるキーと値のペアの形式のインラインプロパティ。すべてのキーと値のペアは、最高の優先順位を持つ単一のテストPropertySourceとして、包含Environmentに追加されます。Supported Syntax
キーと値のペアでサポートされている構文は、JavaプロパティファイルSEのエントリに対して定義されている構文と同じです。
"key=value""key:value""key value"
Precedence
この属性を介して宣言されたプロパティは、リソース
locations()からロードされたプロパティよりも優先順位が高くなります。この属性は、
value()またはlocations()と組み合わせて使用できます。- デフォルト:
- {}
inheritProperties
boolean inheritPropertiesスーパークラスおよびそれを囲むクラスからのインラインテストproperties()を継承する必要があるかどうか。デフォルト値は
trueです。これは、テストクラスがスーパークラスまたはそれを囲むクラスによって定義されたインラインプロパティを継承することを意味します。具体的には、テストクラスのインラインプロパティは、スーパークラスまたはそれを囲むクラスによって定義されたインラインプロパティのリストに追加されます。サブクラスとネストされたクラスには、インライン化されたテストプロパティのリストを拡張するオプションがあります。inheritPropertiesがfalseに設定されている場合、テストクラスのインライン化されたプロパティはシャドウされ、スーパークラスまたはそれを囲むクラスによって定義されたインライン化されたプロパティを効果的に置き換えます。次の例では、
BaseTestのApplicationContextは、インライン化されたkey1プロパティのみを使用してロードされます。対照的に、ExtendedTestのApplicationContextは、インラインのkey1およびkey2プロパティを使用してロードされます。@TestPropertySource(properties = "key1 = value1") @ContextConfiguration public class BaseTest { // ... } @TestPropertySource(properties = "key2 = value2") @ContextConfiguration public class ExtendedTest extends BaseTest { // ... }@TestPropertySourceが繰り返し可能なSEアノテーションとして使用される場合、次の特別な規則が適用されます。- スーパークラスまたは包含クラスから継承される
@TestPropertySourceアノテーションとは対照的に、テストクラス階層の特定のレベルにあるすべての@TestPropertySourceアノテーション(つまり、テストクラスに直接存在するかメタ存在する)はローカルアノテーションと見なされます。 - すべてのローカル
@TestPropertySourceアノテーションは、inheritPropertiesフラグに同じ値を宣言する必要があります。 inheritPropertiesフラグは、ローカル@TestPropertySourceアノテーション間では考慮されません。具体的には、1 つのローカルアノテーションのインラインプロパティが、以前のローカルアノテーションで定義されたインラインプロパティのリストに追加されます。これにより、ローカルアノテーションがインラインプロパティのリストを継承し、個々のプロパティをオーバーライドする可能性があります。
- 関連事項:
- デフォルト:
- true
- スーパークラスまたは包含クラスから継承される