2017-08-08 6 views
1

私のセットアップは次のようなものです。JPAとJUnitテストを使用しているときにメモリデータベースのH2を一貫して消去する方法

JPAを使用してメモリデータベースに接続されているH2は、Springを使用して永続コンテキストが設定されています。データベースのセットアップスクリプトはFlywayによって実行され、テーブルを生成してデータを追加します。

データベースURL:JDBC:H2:MEM:各JUnitテストを取得するために、ここで意図がある、それは自分のデータ我々はこの

@Override 
protected void setUp() throws Exception { 
    this.context = new ClassPathXmlApplicationContext("classpath:/DataContext.xml"); 
    this.data = this.context.getBean(DataProvider.class); 
} 

@Override 
protected void tearDown() throws Exception { 
    this.context.close(); 
    this.context = null; 
    this.data = null; 
} 

などの確立とティアダウンメソッドを持っている私たちのJUnitテストでTEST_DATA

ですこれは時々動作するようですが、前のテストと同じデータベースを取得しているように見えることがあります。 、これらの方法は、任意の順序で実行することができるはずとケースのように見えるMavenのビルドを実行しているとき、彼らはお互いに影響を与えずに独立して実行することができます

public void testGetFoos() 
{  
    Collection<Foo> foos= data.getFoos(); 
    assertEquals(NUMBER_OF_FOOS,foos.size()); 
} 

public void testSaveFoos() 
{  
    Foo bar = makeDummyFoo(); 
    data.saveFoo(bar); 
    Collection<Foo > foos = data.getFoos(); 

    assertEquals(NUMBER_OF_FOOS + 1,foos.size()); 
} 

:例では、私は2つのテストを持っているということですただし、JUnitテストクラスをeclipseから個別に実行すると、saveメソッドが最初に実行され、getメソッドが実行され、前のテストメソッドと同じようにmemデータベースに入っているように見えるため、誤カウントを取得することがあります。

私の質問は、SpringでセットアップしたJUnitテストの間にメモリデータベース内のH2をどのようにして削除するのですか? context.close()メソッドが正しい方法であれば、何が正しくシャットダウンされない可能性がありますか?

答えて

0

私はあなたが使用することを示唆している:あなたは@Beforeにこのコードを置くことができティアダウン

のセットアップ

  • @Afterの試験方法に

    • @Testアノテーションの
    • @Beforeすべての@Testメソッドが新しくdbを持つことを保証するために

      Connection connection = DriverManager.getConnection("jdbc:h2:~/test", "sa", ""); 
      Statement stmt = connection .createStatement() 
      stmt.execute("DROP ALL OBJECTS"); 
      connection.commit(); 
      connection.close(); 
      
  • 1

    私はDbUnitを使用してより良いアプローチになると信じています。正確にこの目的のために意図されています。それを見てください。

    幸運。

    +0

    春のためのより緊密な統合もあります - https://springtestdbunit.github.io/は、 spring-test-dbunit / –

    0

    あなたはセットアップにSpring's @Sql annotationを使用して、このようなあなたのJUnitテストの各テストメソッドの後にデータベースをティアダウンできます

    @SqlGroup({ 
        @Sql(executionPhase = ExecutionPhase.BEFORE_TEST_METHOD, scripts ="classpath:db/data.sql"), 
        @Sql(executionPhase = ExecutionPhase.AFTER_TEST_METHOD, scripts = "classpath:db/clean.sql") 
    }) 
    public void test(){ 
        //test logic 
    } 
    
    関連する問題