アノテーションインターフェース TestBean


@TargetSE(FIELDSE) @RetentionSE(RUNTIMESE) @DocumentedSE @BeanOverride(org.springframework.test.context.bean.override.convention.TestBeanOverrideProcessor.class) @Reflective(org.springframework.test.context.bean.override.convention.TestBeanReflectiveProcessor.class) public @interface TestBean
@TestBean は、テストクラス内の非静的フィールドに適用して、静的ファクトリメソッドを使用してテストの ApplicationContext 内の Bean をオーバーライドできるアノテーションです。

デフォルトでは、上書きする Bean は、アノテーション付きフィールドの型から推測されます。候補が複数存在する場合は、@Qualifier アノテーションを使用して、曖昧さを解消できます。@Qualifier アノテーションがない場合は、アノテーション付きフィールドの名前がフォールバック修飾子として使用されます。または、value または name 属性を設定して、置き換える Bean 名を明示的に指定することもできます。

対応する Bean が存在しない場合は、Bean が作成されます。ただし、対応する Bean が存在しない場合にテストを失敗させたい場合は、enforceOverride 属性を true (たとえば、@TestBean(enforceOverride = true)) に設定できます。

インスタンスは、戻り値の型がアノテーション付きフィールドと互換性のある、引数なしの静的ファクトリメソッドから作成されます。ファクトリメソッドは、@TestBean フィールドを宣言するクラス内、またはそのクラスの上位の型階層内 (実装されたインターフェースを含む) で直接宣言できます。@TestBean フィールドがネストされたテストクラスで宣言されている場合は、そのクラス階層も検索されます。または、外部クラスのファクトリメソッドは、構文 <fully-qualified class name>#<method name> (例: @TestBean(methodName = "org.example.TestUtils#createCustomerRepository")) に従った完全修飾メソッド名で参照できます。

ファクトリメソッドは次のように推論されます。

  • methodName が指定されている場合、Spring はその名前の静的メソッドを検索します。
  • メソッド名が指定されていない場合、Spring は、アノテーション付きフィールドの名前または Bean の name (指定されている場合) のいずれかである名前を持つ静的メソッドを 1 つだけ検索します。

次の例を考えてみましょう。

 class CustomerServiceTests {

    @TestBean
    private CustomerRepository repository;

    // @Test methods ...

    private static CustomerRepository repository() {
        return new TestCustomerRepository();
    }
}

上記の例では、repository Bean は、repository() メソッドによって生成されたインスタンスに置き換えられます。オーバーライドされたインスタンスは repository フィールドに注入されるだけでなく、BeanFactory でも置き換えられるため、その Bean の他のインジェクションポイントではオーバーライドされた Bean インスタンスが使用されます。

より明確にするために、次の例に示すように、Bean とメソッド名を設定できます。

 class CustomerServiceTests {

    @TestBean(name = "customerRepository", methodName = "createTestCustomerRepository")
    CustomerRepository repository;

    // @Test methods ...

    static CustomerRepository createTestCustomerRepository() {
        return new TestCustomerRepository();
    }
}

警告 @TestBean を @ContextHierarchy と組み合わせて使用すると、各 @TestBean がデフォルトですべてのコンテキスト階層レベルに適用されるため、望ましくない結果が生じる可能性があります。特定の @TestBean が単一のコンテキスト階層レベルに適用されるようにするには、contextName を、設定された @ContextConfiguration name と一致するように設定してください。詳細と例については、@ContextHierarchy の Javadoc を参照してください。

注意 : 非シングルトンの Bean をオーバーライドすると、非シングルトンの Bean は、@TestBean ファクトリメソッドから返される値に対応するシングルトンの Bean に置き換えられ、対応する Bean 定義はシングルトンに変換されます。プロトタイプまたはスコープ付き Bean をオーバーライドすると、シングルトンとして扱われます。同様に、FactoryBean によって作成された Bean をオーバーライドすると、FactoryBean は、@TestBean ファクトリメソッドから返される値に対応するシングルトンの Bean に置き換えられます。

@TestBean フィールドまたはファクトリメソッドの可視性に制限はありません。このようなフィールドとメソッドは、プロジェクトのニーズやコーディング方法に応じて、publicprotected、パッケージプライベート (デフォルトの可視性)、または private にすることができます。

@TestBean フィールドは、デフォルトで、囲んでいるテストクラスから継承されます。詳細については、@NestedTestConfiguration を参照してください。

導入:
6.2
作成者:
Simon Basl é , Stephane Nicoll, Sam Brannen
関連事項:
  • オプション要素の概要

    オプション要素
    修飾子と型
    オプションの要素
    説明
    この @TestBean を適用するコンテキスト階層レベルの名前。
    boolean
    オーバーライドされる Bean の存在を要求するかどうか。
    オーバーライドする Bean をインスタンス化するために使用される静的ファクトリメソッドの名前。
    上書きする Bean の名前。
    name() のエイリアス。
  • 要素の詳細

    • value

      @AliasFor("name") StringSE value
      name() のエイリアス。

      他の属性が必要ない場合に使用することを目的としています (例: @TestBean("customBeanName"))。

      関連事項:
      デフォルト:
      ""
    • name

      @AliasFor("value") StringSE name
      上書きする Bean の名前。

      指定しない場合は、オーバーライドする Bean は、必要に応じて修飾子を考慮して、アノテーション付きフィールドの型に応じて選択されます。詳細については、クラスレベルのドキュメントを参照してください。

      関連事項:
      デフォルト:
      ""
    • methodName

      StringSE methodName
      オーバーライドする Bean をインスタンス化するために使用される静的ファクトリメソッドの名前。

      @TestBean フィールドが宣言されているクラス、そのスーパークラスの 1 つ、または実装されているインターフェースでファクトリメソッドを見つけるための検索が実行されます。@TestBean フィールドがネストされたテストクラスで宣言されている場合は、囲むクラス階層も検索されます。

      あるいは、外部クラスのファクトリメソッドは、構文 <fully-qualified class name>#<method name> に従う完全修飾メソッド名 (例: @TestBean(methodName = "org.example.TestUtils#createCustomerRepository")) を介して参照できます。

      指定しない場合は、ファクトリメソッドの名前は、@TestBean フィールドの名前または Bean の name に基づいて検出されます。

      デフォルト:
      ""
    • contextName

      StringSE contextName
      この @TestBean を適用するコンテキスト階層レベルの名前。

      デフォルトでは空の文字列に設定され、この @TestBean をすべてのアプリケーションコンテキストに適用する必要があることを示します。

      コンテキスト名が設定されている場合、@ContextConfiguration(name=...) を介して設定された名前と一致する必要があります。

      導入:
      6.2.6
      関連事項:
      デフォルト:
      ""
    • enforceOverride

      boolean enforceOverride
      オーバーライドされる Bean の存在を要求するかどうか。

      デフォルトは false です。つまり、対応する Bean が存在しない場合に Bean が作成されることを意味します。

      対応する Bean が存在しない場合に例外をスローするには、true に設定します。

      関連事項:
      デフォルト:
      false