首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring事务管理测试

Spring事务管理测试
EN

Stack Overflow用户
提问于 2009-06-09 17:40:15
回答 8查看 11.8K关注 0票数 3

我想使用SpringContextTests测试我的Dao类。

在我的方法类中,为了让我的测试类与JUnit4集成,我扩展了AbstractTransactionalJUnit4SpringContextTests。我还设置了配置,并在@After中的@Before和tearDown中进行了初始化和数据库清理。我的测试类工作得很好。

我的问题是,当我运行我的测试类时,数据库中充满了数据,原始数据没有回滚,我的数据库被清除。在@Before方法中,我清除了数据库并填充了数据,认为我可以回滚它,但事实并非如此。

任何人都可以找到一个在数据库中工作和回滚信息的示例。

插件:

我的测试方法中的每个数据库操作都会回滚。但是,在@Before方法中执行super.deleteFromTables("person")并不会回滚数据库中以前的所有数据。

Spring回滚所有CRUD操作,但在事务之前清理数据库不会回滚。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-06-11 00:17:40

感谢所有回答我问题的人。我从这些答案中学到了很多,但这并没有解决我的问题。

我知道我的测试数据会进行事务管理,它会正确地执行它的工作。

这是我的错误。

我忘记了关于数据库命令的教训,即当您在DML语句之后执行DDL语句时,它将自动提交事务。我在DML之后执行了一个DDL,方法是删除所有记录,然后对表的AUTO_INCREMENT执行ALTER操作,其中将导致自动提交并永久删除表中的所有记录。

修复那个场景解决了我的问题。

票数 2
EN

Stack Overflow用户

发布于 2009-06-09 22:50:58

可能的原因:

  • 您正在使用的数据库/数据库引擎没有使用多个事务管理器和/或数据源的正确的transactions;
  • you're;
  • 您正在测试类

中执行您自己的单独的事务

作为一个例子,这里有一个(在我的头上,没有编译)

代码语言:javascript
复制
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;
  • bean没有任何事务性设置(建议/编程),它依赖于调用者是事务性的-无论是生产中的服务还是我们situation;
  • the测试中的测试都不包括任何事务性管理代码,因为它都是在框架中完成的。
票数 1
EN

Stack Overflow用户

发布于 2009-06-10 16:28:39

我不知道你的班级出了什么问题。下面是一个类的摘录,它可以使用dbunit和Spring2.5实现您想要的功能:

代码语言:javascript
复制
@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注解,我认为你需要重写下面的方法,并把你的设置代码放在里面。

代码语言:javascript
复制
@Override
public void onSetUpInTransaction() throws Exception {...}

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/971483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档