アノテーションインターフェース TestPropertySource
@TestPropertySource
は、テストクラスに適用して、プロパティファイルの locations()
と、統合テスト用の ApplicationContext
の Environment
の PropertySources
セットに追加されるインライン properties()
を構成することができるアノテーションです。優先順位
テストプロパティソースは、オペレーティングシステムの環境または Java システムプロパティからロードされるプロパティソースや、アプリケーションによって宣言的に @PropertySource
を介して、またはプログラムによって (たとえば、ApplicationContextInitializer
またはその他の手段を介して) 追加されたプロパティソースよりも優先順位が高くなります。テストプロパティソースを使用して、システムプロパティソースおよびアプリケーションプロパティソースで定義されたプロパティを選択的にオーバーライドできます。さらに、インライン化された properties()
は、リソース locations()
からロードされるプロパティよりも優先順位が高くなります。ただし、@DynamicPropertySource
を介して登録されたプロパティは、@TestPropertySource
を介してロードされるプロパティよりも優先順位が高くなることに注意してください。
デフォルトのプロパティファイルの検出
@TestPropertySource
が空のアノテーションとして宣言されている場合(つまり、locations()
または properties()
の明示的な値がない場合)、アノテーションを宣言したクラスに関連するデフォルトのプロパティファイルを検出しようとします。例: アノテーション付きテストクラスが com.example.MyTest
の場合、対応するデフォルトプロパティファイルは "classpath:com/example/MyTest.properties"
です。デフォルトを検出できない場合、IllegalStateException
SE がスローされます。
@ TestPropertySource の有効化
@TestPropertySource
は、設定されたコンテキストローダーがそれを尊重する場合に有効になります。AbstractGenericContextLoader
または AbstractGenericWebContextLoader
のサブクラスであるすべての SmartContextLoader
は、@TestPropertySource
の自動サポートを提供します。これには、Spring TestContext フレームワークによって提供されるすべての SmartContextLoader
が含まれます。
その他
- 通常、
@TestPropertySource
は@ContextConfiguration
と組み合わせて使用されます。 @TestPropertySource
は、繰り返し可能なSEアノテーションとして使用できます。- このアノテーションは、カスタム合成アノテーションを作成するためのメタアノテーションとして使用できますが、このアノテーションと
@ContextConfiguration
を合成アノテーション上で組み合わせる場合は、両方のアノテーションのlocations
属性とinheritLocations
属性により属性解決プロセス中に曖昧さが生じる可能性があるため、注意が必要です。ただし、@AliasFor
を使用して明示的にアノテーション属性をオーバーライドすることで、曖昧さを回避できることに注意してください。 - Spring Framework 5.3 以降、このアノテーションはデフォルトでそれを囲むテストクラスから継承されます。詳細については、
@NestedTestConfiguration
を参照してください。
- 導入:
- 4.1
- 作成者:
- Sam Brannen
- 関連事項:
オプション要素のサマリー
修飾子と型オプションの要素説明特定のリソースの文字エンコーディングを指定します (たとえば、"UTF-8" )。ClassSE<? extends PropertySourceFactory>
カスタムPropertySourceFactory
を指定します(ある場合)。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"
です。別のファイル形式をサポートするには、適切なPropertySourceFactory
を構成します。Path Resource Semantics
各パスは Spring
Resource
として解釈されます。プレーンパス (例:"test.properties"
) は、テストクラスが定義されているパッケージに相対的なクラスパスリソースとして扱われます。スラッシュで始まるパスは、絶対クラスパスリソースとして扱われます (例:"/org/example/test.xml"
)。URL を参照するパス (例:classpath:
、file:
、http:
などで始まるパス) は、指定されたリソースプロトコルを使用して読み込まれます。パス内のプロパティプレースホルダー (つまり、
${...}
) は、Environment
に対して解決されます。Spring Framework 6.1 では、リソースの場所のパターンもサポートされています。たとえば、
"classpath*:/config/*.properties"
。警告 :
"classpath*:/config/*.properties"
などのパターンは、{"classpath:/config/mail.properties", classpath:/config/order.properties"}
などのリソース位置の明示的な列挙と事実上同等である可能性があります。ただし、パターンを具体的な場所に積極的に解決することができないため、2 つの宣言ではコンテキストキャッシュのキーが異なります。コンテキストキャッシュの利点を活用するには、テストスイート内でリソースの場所のパターンまたは明示的な列挙を一貫して使用する必要があります。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
に追加されます。Spring Framework 6.1 以降、複数のキーと値のペアを 1 つのテキストブロックで指定できます。Supported Syntax
キーと値のペアでサポートされている構文は、JavaプロパティファイルSEのエントリに対して定義されている構文と同じです。
"key=value"
"key:value"
"key value"
警告 : 上記の構文バリアントのいずれか、およびキーと値の間に任意の数のスペースを使用してプロパティを定義できますが、テストスイート内では 1 つの構文バリアントと一貫したスペースを使用することをお勧めします。たとえば、
"key= value"
、"key=value"
などの代わりに常に"key = value"
を使用することを検討してください。同様に、テキストブロックを使用してインラインプロパティを定義する場合は、テストスイート全体でインラインプロパティに一貫してテキストブロックを使用する必要があります。その理由は、コンテキストキャッシュのキーを決定するために、指定した正確な文字列が使用されるためです。したがって、コンテキストキャッシュの利点を活用するには、インラインプロパティを一貫して定義する必要があります。Examples
// Using an array of strings @TestPropertySource(properties = { "key1 = value1", "key2 = value2" }) @ContextConfiguration class MyTests { // ... }
// Using a single text block @TestPropertySource(properties = """ key1 = value1 key2 = value2 """ ) @ContextConfiguration class MyTests { // ... }
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
- スーパークラスまたは包含クラスから継承される
encoding
StringSE encoding特定のリソースの文字エンコーディングを指定します (たとえば、"UTF-8" )。指定しない場合は、JVM のデフォルトの文字エンコーディングが使用されます。
- 導入:
- 6.1
- デフォルト:
- ""
factory
ClassSE<? extends PropertySourceFactory> factoryカスタムPropertySourceFactory
を指定します(ある場合)。デフォルトでは、
Properties
SE の*.properties
および*.xml
ファイル形式をサポートする標準リソースファイルのファクトリが使用されます。- デフォルト:
- org.springframework.core.io.support.PropertySourceFactory.class