Spring Jdbc嵌入式数据库lifecycyle

时间:2014-06-21 20:01:08

标签: spring spring-jdbc

我在spring上下文文件中使用spring嵌入式jdbc数据库配置进行Junit测试。我在内存数据库中用于测试。我正在尝试仅对DAO层进行单元测试,对于单元测试,我在内存数据库中使用spring容器。

当我运行Junit测试用例时,我没有在第二个测试用例中看到第一个测试用例值(testAddressUpdate测试用例中的testAddressCreate)。我现在不在我的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());
    }
}

}

1 个答案:

答案 0 :(得分:0)

默认情况下,@Transactional测试方法将回滚在测试方法期间对数据库所做的任何更改。如果要更改此行为,则需要使用@Rollback(false)注释方法。我不认为文档是关于默认行为的具体内容,但Javadocs提到了这个here

  

检索指定类的TransactionConfigurationAttributes,该类可以选择声明或继承@TransactionConfiguration。如果提供的类不存在TransactionConfiguration,则将使用TransactionConfiguration中定义的属性的默认值。

default value defined in TransactionConfiguration for rollback是“真实的”。 话虽如此,你需要这样的东西才能保留第一个@Test方法中的第一个值:

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

要在内存中使用HSQLDB进行连接,请查看Stackoverflow上的this post