春には、明示的に工場からBeanを検索しません。代わりに、コンテナは使用前にコンテナを初期化します。したがって、コンテナ自体を呼び出す必要はありません。
ビジネスロジックの呼び出しを処理するサービス、トランザクションロジックの呼び出しを処理するWebコントロール、および単純なクエリや更新を実行するメソッドを持つデータアクセスオブジェクトをWebコントローラで処理するのが一般的です。 (これらはすべてステートレスで、唯一のインスタンスメンバーは他のステートレスオブジェクトへの参照であり、複数の要求を同時に実行できます)。各レイヤーのオブジェクトは、下位レイヤーのオブジェクトに依存し、Springはこれらのオブジェクトをすべて起動時。
サービスを使用するコントローラを持っている場合、Springはコントローラとサービスを作成し、サービスをコントローラに配線します。アプリケーションコードは決してBeanファクトリを呼び出しません。
public class SomeWebController {
private MyBusinessLogicService myBusinessLogicService;
public SomeWebController(MyBusinessLogicService myBusinessLogicService) {
this.myBusinessLogicService = myBusinessLogicService;
}
...
}
ユニットテストでは、コンテナについて知る必要はありません。テストは、依存関係を作成し、setterメソッドを直接呼び出すか、テスト設定を作成し、そのプラグをモックに持たせることによって、依存関係のモックをプラグインすることによって、テスト対象のオブジェクトをセットアップできます。
私は、Springを使用しないコントローラを持っていて、そのコンストラクタを使って直接サービスをインスタンス化すると、そのサービスのモックを置換するのは難しいです。私は、サービスのためのファクトリメソッドを導入するためにリファクタのような何かをしなければならないだろうし、テストではモックを返すためにそれをオーバーライドする。これは、私がテストしていたクラスをサブクラス化しなければならない定型コードを導入することになり、オーバーライドされたファクトリメソッドが実行されなかった私のカバレッジにはギャップがあります。
フィールド注入の代わりにコンストラクタ注入を使用します。それでは、依然としてユニットテストで 'new'を使用して、依存関係のモックを提供することができます。 – chrylis
そして、あなたが 'getBean'を使うつもりであっても(コンストラクタインジェクションを使います、あなたのテストクラスにautowireを使います)、ジェネリックシグネチャを使います。 – chrylis