2016-03-20 5 views
1

最近、私はSpringと依存性注入の概念を学び始めました。私はJunit testingとMockingという概念を持っていますが、依然依存性注入が提供する特定のテスト関連の利点について私の頭を包み込むことはできませんでした。例えば依存性注入によるテストの利点

私はクラストライアングル次のようインスタンス化: - 依存性の注入は、春を使用して、今

Triangle triangle1 = new Triangle(); 

をして、私は

Triangle triangle2 = (Triangle) beanFactory.getBean("triangle"); 

Triangleクラスには、いくつかのメソッドを持って言って、それを次のように行いますそれはテストが必要です。テストで異なるアプローチは何でしょうか?triangle1triangle2

+1

フィールド注入の代わりにコンストラクタ注入を使用します。それでは、依然としてユニットテストで 'new'を使用して、依存関係のモックを提供することができます。 – chrylis

+0

そして、あなたが 'getBean'を使うつもりであっても(コンストラクタインジェクションを使います、あなたのテストクラスにautowireを使います)、ジェネリックシグネチャを使います。 – chrylis

答えて

1

春には、明示的に工場からBeanを検索しません。代わりに、コンテナは使用前にコンテナを初期化します。したがって、コンテナ自体を呼び出す必要はありません。

ビジネスロジックの呼び出しを処理するサービス、トランザクションロジックの呼び出しを処理するWebコントロール、および単純なクエリや更新を実行するメソッドを持つデータアクセスオブジェクトをWebコントローラで処理するのが一般的です。 (これらはすべてステートレスで、唯一のインスタンスメンバーは他のステートレスオブジェクトへの参照であり、複数の要求を同時に実行できます)。各レイヤーのオブジェクトは、下位レイヤーのオブジェクトに依存し、Springはこれらのオブジェクトをすべて起動時。

サービスを使用するコントローラを持っている場合、Springはコントローラとサービスを作成し、サービスをコントローラに配線します。アプリケーションコードは決してBeanファクトリを呼び出しません。

public class SomeWebController { 
    private MyBusinessLogicService myBusinessLogicService; 

    public SomeWebController(MyBusinessLogicService myBusinessLogicService) { 
     this.myBusinessLogicService = myBusinessLogicService; 
    } 
    ... 
} 

ユニットテストでは、コンテナについて知る必要はありません。テストは、依存関係を作成し、setterメソッドを直接呼び出すか、テスト設定を作成し、そのプラグをモックに持たせることによって、依存関係のモックをプラグインすることによって、テスト対象のオブジェクトをセットアップできます。

私は、Springを使用しないコントローラを持っていて、そのコンストラクタを使って直接サービスをインスタンス化すると、そのサービスのモックを置換するのは難しいです。私は、サービスのためのファクトリメソッドを導入するためにリファクタのような何かをしなければならないだろうし、テストではモックを返すためにそれをオーバーライドする。これは、私がテストしていたクラスをサブクラス化しなければならない定型コードを導入することになり、オーバーライドされたファクトリメソッドが実行されなかった私のカバレッジにはギャップがあります。

+0

お返事ありがとうございます。だから、元の投稿で2番目のケースをテストすると、次のようなものが書かれます: 'Triangle tester = Mockito.mock(Triangle.class); ' 私は最初のケースで同じことを書いていますか?容器に無関心な人は、私を好都合な状況に置くのはどうでしょうか? – user3559089

+0

@ user3559089;より洗練された例が役立つでしょう。 Springは、物事を一緒に配線するためのものです。例として単一のオブジェクトしか持たない場合、問題の内容を確認するのは難しいです。 –

+0

あなたは私に洗練された例を教えてもらえますか?私はあなたが考えている例がどんなものなのか分かりません...ありがとう! – user3559089