2017-01-27 5 views
3

私は春にはかなり新しく、Craig Wallsの "Spring in Action"(第4版)を使って勉強します。関心のあるのは、動作しているコードを書く方法だけでなく、Springを使う正しい原則にも関わっています。 5.6リストページ142から次のコードについてコンストラクタ呼び出しで作成されたSpring Beanを使用することが許容される場合はありますか?

、:

public class HomeControllerTest { 

    @Test 
    public void testHomePage() throws Exception { 
     HomeController controller = new HomeController(); 
     MockMvc mockMvc = standaloneSetup(controller).build(); 
     mockMvc.perform(get("/")).andExpect(view().name("home")); 
    } 
} 

私の質問は以下の思考によって生成されます。一般的な理解は春のように依存性注入を使用していることである

  1. オブジェクトの依存関係の管理オーバーヘッドを削減し、モジュール性を高め、テストやコードの再利用を簡素化します。ただし、コンテナによってBeanを作成して管理する必要があることを意味していませんか?私がこのテーマについて読んで始めたので、私が覚えた最初のディテールでは、newはDIに続くコードの中に決して現れてはならないと述べました。
  2. Stateful beanをテストしたい場合は、これが解決策ですか?つまり、同じインスタンス上で複数の独立したテストを実行する場合、それぞれが同じBeanの状態をテストします。これを行うための適切な注釈があることが分かったとしても(@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
  3. newを使用している場合を除いて)他の方法で解決することが困難または不可能なユースケースがありますか?

「手紙に」より多くの実装では、ApplicationContextを指定する@ContextConfigurationを使用します。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = WebConfig.class) 
@WebAppConfiguration 
public class HomeControllerTest { 

    @Autowired 
    HomeController controller; 

    @Test 
    public void testHomePage() throws Exception { 
     MockMvc mockMvc = standaloneSetup(controller).build(); 
     mockMvc.perform(get("/")).andExpect(view().name("home")); 
    } 
} 
+0

*別の方法で解決することが困難または不可能な別のユースケースがありますか?これはどういう意味ですか? – CKing

+0

@CKing私は、選択肢がなく、明示的なコンストラクタ(bean = new Bean(...)のように)を使ってBeanを作成する必要がある場合があります。本の例と質問2では、私は代替案を見つけたので、ある問題を解決する唯一の新しい方法が他にあるのか疑問に思っていました。 – aUserHimself

答えて

1
  1. はい、あなたは生産コードで(そうでない場合はもう豆春いない)のSpring Beanのインスタンスを作成するために、新しい使用しないでください。しかし、DIの全体のポイントは、単体テストで偽の依存関係を作成して手動でオブジェクトを注入させることです。したがって、ここのテストコードは完璧です。

  2. はい、それぞれの単体テストは、独自のBeanインスタンスを作成し、必要な方法でそれを設定できます。しかし、ステートフルな豆は非常にまれです。彼らは通常無国籍です。

  3. Spring Beanを作成するためにnewを使用する別の場所は、正確にはコンフィグレーションクラスの@Beanという名前のメソッドです。これらのメソッドのポイントは、Spring Beanを作成して初期化し、Spring Beanを使用して注入することです。しかし、ユニットテストで新しいものを使用することは、絶対にうまくいき、適切なことです。

+0

これを明確にすることに感謝します。 – aUserHimself

関連する問題