我在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());
}
}
}
答案 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。