2017-08-08 52 views
1

我的設置是這樣的。如何在使用JPA和JUnit測試時始終擦除內存數據庫中的H2

H2在內存數據庫連接到使用JPA的持久性上下文使用Spring進行配置。數據庫設置腳本由Flyway運行以生成我的表格並添加數據。

數據庫網址:JDBC:H2:MEM:TEST_DATA

在我們的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測試得到它自己的數據基地,這似乎有時工作,但似乎有些時候,看起來像我得到的數據庫與以前的測試相同。一個例子是,我有2個試驗:

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()); 
} 

這些方法應該能夠以任意順序運行,並且運行似乎是這樣的Maven構建的時候,他們能夠在不影響彼此獨立運行,然而,偶爾在eclipse中單獨運行JUnit測試類時,save方法將首先運行,然後get方法將運行並得到錯誤的計數,因爲它似乎在mem數據庫中與以前的測試方法相同。

所以我的問題是如何殺死我的內存數據庫之間的JUnit測試使用我的設置與春季H2?或者如果context.close()方法是正確的方法,可能會導致它無法正常關閉?

回答

0

我建議你使用:

  • @Test註解測試方法
  • @Before上設置
  • @After上拆卸

你可以把這個代碼@Before確保所有的@Test方法都有新的分區

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/彈簧體檢查的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 
} 
相關問題