2014-06-21 102 views
1

我正在使用針對JUnit測試Spring上下文文件春天嵌入式JDBC數據庫配置。我正在使用內存數據庫進行測試。我想單元測試只有DAO層和單元測試我正在使用內存數據庫中的spring容器。了Spring JDBC嵌入式數據庫lifecycyle

當我運行JUnit測試情況下,我沒有看到第二個測試案例的第一個測試用例值(testAddressCreate在testAddressUpdate測試用例)。我現在不在我的Junit中使用@Before或@After。我不確定spring如何在內存數據庫中創建並啓動它。根據行爲,它似乎是在每個測試用例之前創建或重置。有人知道嗎?另外我們如何連接到在內存數據庫中創建的spring。請建議。

Spring配置如下:

<jdbc:embedded-database id="dataSource" type="HSQL"> 
    <jdbc:script location="classpath:createdb.sql" /> 

JUnit測試的情況是:

@ContextConfiguration(locations="classpath:test-context.xml") 
@Transactional 
public class GenericDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests { 

@Autowired 
private GenericDao<Address, Long> addressDao; 

@Test 
public void testAddressCreate() { 
    Address address = new Address(); 
    address.setAddress1("first address"); 
    address.setCity("First City"); 
    address.setCountry("First one"); 
    address.setPostalCode("22222"); 
    boolean result = addressDao.create(address); 
    Assert.assertEquals(true, result); 

    List<Address> listOfAddress = addressDao.findAll(); 
    Assert.assertNotNull(listOfAddress); 
    for(Address addressTemp : listOfAddress){ 
     System.out.println(addressTemp.getAddress1()); 
     System.out.println(addressTemp.getAddressId()); 
    } 
} 

@Test 
public void testAddressUpdate(){ 
    Address address = new Address(); 
    address.setAddress1("second address"); 
    address.setCity("Second City"); 
    address.setCountry("Second one"); 
    address.setPostalCode("11111"); 
    boolean result = addressDao.create(address); 
    Assert.assertEquals(true, result); 

    address.setAddress1("Updated Second Address"); 
    Assert.assertNotNull(addressDao.update(address)); 

    List<Address> listOfAddress = addressDao.findAll(); 
    Assert.assertNotNull(listOfAddress); 
    for(Address addressTemp : listOfAddress){ 
     System.out.println(addressTemp.getAddress1()); 
     System.out.println(addressTemp.getAddressId()); 
    } 
} 

}

+0

也有一些是你的代碼錯誤或配置......沒有人可以告訴你,沒有你提供的代碼。 – Raedwald

+0

@Raedwald我已經添加了代碼和jdbc配置。 – Icoder

+0

這是不是一個真正的測試,除非你的測試是一個簡單的是否可以創建地址的情況下,應用了setter方法測試,以及創建和更新及的findAll()方法不爆炸。你對你的方法的行爲一無所知。 – MetroidFan2002

回答

0

默認情況下,@Transactional測試方法將回滾到所做的任何更改數據庫在測試方法期間。如果你想改變這種行爲,你需要用@Rollback(false)註釋你的方法。我不認爲文檔特定有關默認行爲,但的Javadoc提到了這一點here

檢索指定類可以任選聲明或繼承@TransactionConfiguration的TransactionConfigurationAttributes。如果TransactionConfiguration不存在於提供的類中,則將使用TransactionConfiguration中定義的屬性的默認值。

default value defined in TransactionConfiguration for rollback是「真」。 這些雖這麼說,你需要這樣的事情是能夠保持的值從第一@Test方法的第二個:

@Test 
@Rollback(false) 
public void testAddressCreate() { 
    Address address = new Address(); 
    ... 
} 

對於在內存HSQLDB連接,看看this post#2 。

+0

謝謝安德烈,那就是我一直在尋找:) +1爲你的答案。 – Icoder

+0

@StackUser,如果您認爲我的回答對您有幫助並解決了您的問題,請考慮接受它,這樣其他人就會知道這是一個有用且可靠的信息。 –

+0

我不知道如何接受它。我試圖增加有用答案的計數,它並沒有讓我增加,因爲我是新的stackoverflow和沒有太多的名譽在這裏:(。 – Icoder