アノテーションインターフェース 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アノテーションとして使用できます。
  • このアノテーションは、カスタム合成アノテーションを作成するためのメタアノテーションとして使用できますが、このアノテーションと @ContextConfiguration を合成アノテーション上で組み合わせる場合は、両方のアノテーションの locations 属性と inheritLocations 属性により属性解決プロセス中に曖昧さが生じる可能性があるため、注意が必要です。ただし、@AliasFor を使用して明示的にアノテーション属性をオーバーライドすることで、曖昧さを回避できることに注意してください。
  • Spring Framework 5.3 以降、このアノテーションはデフォルトでそれを囲むテストクラスから継承されます。詳細については、@NestedTestConfiguration を参照してください。
導入:
4.1
作成者:
Sam Brannen
関連事項:
  • オプション要素のサマリー

    オプション要素
    修飾子と型
    オプションの要素
    説明
    特定のリソースの文字エンコーディングを指定します (たとえば、"UTF-8" )。
    カスタム PropertySourceFactory を指定します(ある場合)。
    boolean
    スーパークラスおよびそれを囲むクラスからのテストプロパティソース locations()継承する必要があるかどうか。
    boolean
    スーパークラスおよびそれを囲むクラスからのインラインテスト properties()継承する必要があるかどうか。
    Environment の PropertySources のセットにロードされるプロパティファイルのリソースの場所。
    ApplicationContext がテスト用にロードされる前に Spring Environment に追加する必要があるキーと値のペアの形式のインラインプロパティ
    locations() のエイリアス。
  • 要素の詳細

    • value

      @AliasFor("locations") StringSE[] value
      locations() のエイリアス。

      この属性は、locations() と組み合わせて使用することはできませんが、locations()代わりに使用することができます。

      関連事項:
      デフォルト:
      {}
    • locations

      @AliasFor("value") StringSE[] 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アノテーションとして使用される場合、次の特別な規則が適用されます。

      1. スーパークラスから継承される @TestPropertySource アノテーションとは対照的に、テストクラス階層の特定のレベル(つまり、テストクラスに直接存在するかメタ存在する)のすべての @TestPropertySource アノテーションは、ローカルアノテーションと見なされます。
      2. すべてのローカル @TestPropertySource アノテーションは、inheritLocations フラグに同じ値を宣言する必要があります。
      3. inheritLocations フラグは、ローカル @TestPropertySource アノテーション間では考慮されません。具体的には、1 つのローカルアノテーションのプロパティソースの場所が、以前のローカルアノテーションで定義されたプロパティソースの場所のリストに追加されます。これにより、ローカルアノテーションがテストプロパティソースの場所のリストを継承し、個々のプロパティをオーバーライドする可能性があります。
      関連事項:
      デフォルト:
      true
    • properties

      StringSE[] properties
      ApplicationContext がテスト用にロードされる前に、Spring Environment に追加する必要があるキーと値のペアの形式のインラインプロパティ。すべてのキーと値のペアは、最も高い優先順位を持つ単一のテスト 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アノテーションとして使用される場合、次の特別な規則が適用されます。

      1. スーパークラスまたは包含クラスから継承される @TestPropertySource アノテーションとは対照的に、テストクラス階層の特定のレベルにあるすべての @TestPropertySource アノテーション(つまり、テストクラスに直接存在するかメタ存在する)はローカルアノテーションと見なされます。
      2. すべてのローカル @TestPropertySource アノテーションは、inheritProperties フラグに同じ値を宣言する必要があります。
      3. inheritProperties フラグは、ローカル @TestPropertySource アノテーション間では考慮されません。具体的には、1 つのローカルアノテーションのインラインプロパティが、以前のローカルアノテーションで定義されたインラインプロパティのリストに追加されます。これにより、ローカルアノテーションがインラインプロパティのリストを継承し、個々のプロパティをオーバーライドする可能性があります。
      関連事項:
      デフォルト:
      true
    • encoding

      StringSE encoding
      特定のリソースの文字エンコーディングを指定します (たとえば、"UTF-8" )。

      指定しない場合は、JVM のデフォルトの文字エンコーディングが使用されます。

      導入:
      6.1
      デフォルト:
      ""
    • factory

      ClassSE<? extends PropertySourceFactory> factory
      カスタム PropertySourceFactory を指定します(ある場合)。

      デフォルトでは、PropertiesSE の *.properties および *.xml ファイル形式をサポートする標準リソースファイルのファクトリが使用されます。

      導入:
      6.1
      関連事項:
      デフォルト:
      org.springframework.core.io.support.PropertySourceFactory.class