我想使用SpringContextTests测试我的Dao类。
在我的方法类中,为了让我的测试类与JUnit4集成,我扩展了AbstractTransactionalJUnit4SpringContextTests。我还设置了配置,并在@After中的@Before和tearDown中进行了初始化和数据库清理。我的测试类工作得很好。
我的问题是,当我运行我的测试类时,数据库中充满了数据,原始数据没有回滚,我的数据库被清除。在@Before方法中,我清除了数据库并填充了数据,认为我可以回滚它,但事实并非如此。
任何人都可以找到一个在数据库中工作和回滚信息的示例。
插件:
我的测试方法中的每个数据库操作都会回滚。但是,在@Before方法中执行super.deleteFromTables("person")并不会回滚数据库中以前的所有数据。
Spring回滚所有CRUD操作,但在事务之前清理数据库不会回滚。
发布于 2009-06-11 00:17:40
感谢所有回答我问题的人。我从这些答案中学到了很多,但这并没有解决我的问题。
我知道我的测试数据会进行事务管理,它会正确地执行它的工作。
这是我的错误。
我忘记了关于数据库命令的教训,即当您在DML语句之后执行DDL语句时,它将自动提交事务。我在DML之后执行了一个DDL,方法是删除所有记录,然后对表的AUTO_INCREMENT执行ALTER操作,其中将导致自动提交并永久删除表中的所有记录。
修复那个场景解决了我的问题。
发布于 2009-06-09 22:50:58
可能的原因:
中执行您自己的单独的事务
作为一个例子,这里有一个(在我的头上,没有编译)
public class DBTest extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
private SomeDAO _aBeanDefinedInMyContextFile;
@Test
public void insert_works() {
assert _aBeanDefinedInMyContextFile.findAll() == 0;
_aBeanDefinedInMyContextFile.save(new Bean());
assert _aBeanDefinedInMyContextFile.findAll() == 1;
}
}要点:
SomeDAO是一个接口,它对应于在我的上下文中声明的bean;发布于 2009-06-10 16:28:39
我不知道你的班级出了什么问题。下面是一个类的摘录,它可以使用dbunit和Spring2.5实现您想要的功能:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
"testContext.xml"})
@TransactionConfiguration
@Transactional
public class SampleDAOTest {
@Autowired
private DataSource dataSource;
@Autowired
private SampleDAO sampleDAO;
@Before
public void onSetUpInTransaction() throws Exception {
//Populate Test data
IDatabaseConnection dbUnitCon = new DatabaseConnection(DataSourceUtils.getConnection(dataSource), "DATASOURCE");
//read in from a dbunit excel file of test data
IDataSet dataSet = new XlsDataSet(new File("src/test/resources/TestData.xls"));
DatabaseOperation.INSERT.execute(dbUnitCon, dataSet);
}
@Test
public void testGetIntermediaryOrganisation() {
// Test getting a user
User object = sampleDAO.getUser(99L);
assertTrue(object.getValue);
}
}这种方法的好处之一是您不需要扩展任何类。因此,您仍然可以拥有自己的测试层次结构。
如果你真的想坚持你当前的方法,而不是使用@before注解,我认为你需要重写下面的方法,并把你的设置代码放在里面。
@Override
public void onSetUpInTransaction() throws Exception {...}希望这能有所帮助
https://stackoverflow.com/questions/971483
复制相似问题