2016-03-27 25 views
0

私は、PlayアプリケーションでSpringアノテーションベースの設定を使用しています。Spring:実際のオブジェクトの代わりにモックを作成する

コントローラとDAOはSpring Beanです。コントローラ層とDAO層は異なるSpringプロファイルで定義され、各層は個別に無効にすることができます。

コントローラレイヤーをDAOレイヤーから分離してテストしたいと思います。私はDAOのプロフィールを無効にし、それぞれのDAO beanをMockitoモックとして再定義しました。機能的な観点から、私は好きではない唯一のものは、次のように手動でモックを定義して、正常に動作します:

@Configuration 
@Import(AppContext.class) 
public class TestAppContext { 

    @Bean 
    public DaoA getDaoA(){ 
     return mock(DaoA.class); 
    } 

    //... all dependencies are re-defined manually 
} 

@ComponentScan注釈付きのような)パッケージ を定義し、中にすべてのBeanを取得する方法はありますそのパッケージを実際のオブジェクトの代わりにモックとして使用しますか?

UPD: 私はFakeApplicationhttps://www.playframework.com/documentation/2.0/api/java/play/test/FakeApplication.html)でテストを実行しています。そのため、コンテキストはテストレベルではなく、偽のアプリケーションの起動時に開始されます。

public class ControllerTest extends WithApplication { 

    @Before 
    public void setUp() throws Exception { 
     start(fakeApplication(new GlobalSettings(){ 
      private ApplicationContext appContext; 

      public void onStart(Application app) { 
       appContext = new AnnotationConfigApplicationContext(TestAppContext.class); 
      } 

      @Override 
      public <A> A getControllerInstance(Class<A> clazz) throws Exception { 
       return appContext.getBean(clazz); 
      } 
     })); 
    } 

    ... 
} 

私は、テストの信頼性を高めるとコントローラが実環境でどのように動作するかをテストするためにwan'tので、私はこのようにそれをやった:(

@Test 
public void testControllerMethod() { 
    Result result = route(fakeRequest(GET, "/controller/method")); 
    assertThat(result).is(...); 
} 
+0

@ContextConfiguration(classes = { AutoMockRegistryPostProcessor.class, RestOfClasses.class, ... }) @RunWith(SpringJUnit4ClassRunner.class) public class YourTest { ... } 

あなたがプログラムでポストプロセッサを登録することができ、自分でApplicationContextを作成しているとコンテキストは完全にコンストラクタにモックを渡します。 – chrylis

+0

私はすでにコンストラクタインジェクションを使用しています。私が完全に文脈を必要とする理由は、テストフレームワークが必要とするためです。 –

答えて

1

モックする必要がある依存関係の数が多い場合は、spring-auto-mockを使用することもできます。あなたはコンストラクタ・インジェクションの代わりに、フィールド注入を使用するように、コントローラを再設定する場合は、あなたがの必要性を回避することができます

 public void onStart(Application app) { 
      appContext = new AnnotationConfigApplicationContext(TestAppContext.class); 
      appContext.getBeanFactory().addBeanPostProcessor(new AutoMockRegistryPostProcessor()) 
     } 
+0

あなたの答えをありがとう。コンテキストの初期化に関する私の更新を見てください。 SpringJUnit4ClassRunnerはここでは適用されないようです。 –

+0

@OleksandrHorobets私は答えを編集しました – Ruben

0
  1. マーク@RunWithであなたのユニットテスト@Mock
  2. などSpringJUnit4ClassRunner.class)
  3. マークあなたのテストクラス@InjectMock
  4. マークあなたダオクラスとして使用してくださいプロジェクト内のMockitoの番号
関連する問題