Java 弹簧测试:可计数的坏结果
我使用导入静态org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable对Hibernate与HSQL数据库的连接进行了以下测试:代码>Java 弹簧测试:可计数的坏结果,java,spring,hibernate,spring-test,Java,Spring,Hibernate,Spring Test,我使用导入静态org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable对Hibernate与HSQL数据库的连接进行了以下测试: 对表中的行进行计数,但删除一行后,结果仍然相同。我的代码有什么问题 更新:jdbcTemplate和HibernateSessionFactory使用相同的数据源bean。 package com.habuma.spitter.persistence; import static org.j
对表中的行进行计数,但删除一行后,结果仍然相同。我的代码有什么问题 更新:
jdbcTemplate
和HibernateSessionFactory
使用相同的数据源bean。
package com.habuma.spitter.persistence;
import static org.junit.Assert.assertEquals;
import static org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.annotation.Transactional;
import com.habuma.spitter.domain.Spitter;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:persistence-context.xml",
"classpath:test-dataSource-context.xml",
"classpath:test-transaction-context.xml"})
@TransactionConfiguration(transactionManager="txMgr", defaultRollback=true)
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class })
@Transactional
public class DataAccessUnitTestTemplate {
@Autowired
private ApplicationContext context;
@Autowired
private SpitterDao spitterDao;
@Autowired
private SimpleJdbcTemplate jdbcTemplate;
@Test
public void testDataAccess() {
Spitter spitter = new Spitter();
spitter.setFullName("First");
spitter.setEmail("one@gmail.com");
spitter.setUsername("onefirst");
spitter.setPassword("password");
spitter.setUpdateByEmail(false);
//add to database
spitterDao.addSpitter(spitter);
//update user with id = 3
Spitter toChangeSpitter = spitterDao.getSpitterById(3);
toChangeSpitter.setFullName("NULL");
spitterDao.saveSpitter(toChangeSpitter);
//add next user
spitter = new Spitter();
spitter.setFullName("Second");
spitter.setEmail("two@gmail.com");
spitter.setUsername("twosecond");
spitter.setPassword("pass");
spitter.setUpdateByEmail(false);
spitterDao.addSpitter(spitter);
assertEquals(4, countRowsInTable(jdbcTemplate, "spitter"));
for(int i = 1; i <= 4; i++) {
spitter = spitterDao.getSpitterById((long)i);
System.out.println(spitter.getId() + " : " + spitter.getUsername() + " : " + spitter.getFullName());
}
//delete user with ID = 4
spitterDao.deleteSpitter(4);
System.out.println("\n");
for(int i = 1; i <= 3; i++) {
spitter = spitterDao.getSpitterById((long)i);
System.out.println(spitter.getId() + " : " + spitter.getUsername() + " : " + spitter.getFullName());
}
System.out.println("Ehm ... " + spitterDao.getSpitterById(4)); //null
assertEquals(3, countRowsInTable(jdbcTemplate, "spitter")); //assertion ? rows still 4
}
}
package com.habuma.spitter.persistence;
导入静态org.junit.Assert.assertEquals;
导入静态org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.context.ApplicationContext;
导入org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
导入org.springframework.test.context.ContextConfiguration;
导入org.springframework.test.context.TestExecutionListeners;
导入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
导入org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
导入org.springframework.test.context.transaction.TransactionConfiguration;
导入org.springframework.test.context.transaction.TransactionalTestExecutionListener;
导入org.springframework.transaction.annotation.Transactional;
导入com.habuma.spitter.domain.spitter;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(位置={“classpath:persistence context.xml”,
“classpath:test dataSource context.xml”,
“classpath:test transaction context.xml”})
@TransactionConfiguration(transactionManager=“txMgr”,defaultRollback=true)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,TransactionalTestExecutionListener.class})
@交易的
公共类DataAccessUnitTestTemplate{
@自动连线
私有应用程序上下文上下文;
@自动连线
私人斯皮特道斯皮特道;
@自动连线
私有SimpleJdbcTemplate jdbcTemplate;
@试验
public void testDataAccess(){
吐痰器=新吐痰器();
spitter.setFullName(“第一”);
spitter.setEmail(“one@gmail.com");
设置用户名(“onefirst”);
设置密码(“密码”);
spitter.setUpdateByEmail(假);
//添加到数据库
斯皮特道。阿德斯皮特(斯皮特);
//使用id=3更新用户
Spitter-toChangeSpitter=spitterDao.getSpitterById(3);
toChangeSpitter.setFullName(“NULL”);
储蓄储蓄者(toChangeSpitter);
//添加下一个用户
spitter=新的spitter();
spitter.setFullName(“第二”);
spitter.setEmail(“two@gmail.com");
设置用户名(“两秒钟”);
设置密码(“通过”);
spitter.setUpdateByEmail(假);
斯皮特道。阿德斯皮特(斯皮特);
assertEquals(4,countRowsInTable(jdbcTemplate,“spitter”);
对于(int i=1;i!Assertion!为了确保获得预期的结果,您需要在每次断言之前刷新Hibernate会话。否则,某些内容可能会缓存在会话中,而不会在数据库上执行。这种方式调用Hibernate函数将返回正确的结果,因为它会知道缓存,但会绕过它,directly通过JDBC,将看不到缓存和返回strage内容。您的整个测试方法似乎正在同一事务中运行。如果您使用hibernate而不是JDBC进行计数,我打赌您将得到预期的答案。参考手册在测试一章的注释中也提示了此行为。
1 : habuma : Craig Walls
2 : artnames : Art Names
3 : onefirst : NULL
4 : twosecond : Second
1 : habuma : Craig Walls
2 : artnames : Art Names
3 : onefirst : NULL
Ehm ... null
>>!Assertion!<<
java.lang.AssertionError: expected:<3> but was:<4>