代码之家  ›  专栏  ›  技术社区  ›  Tom Carter

我应该如何配置Spring和Hibernate,以便集成测试能够正确地复制Web应用程序的行为?

  •  0
  • Tom Carter  · 技术社区  · 15 年前

    我们有一个基于nspling 1.2和nhibernate 2的Web应用程序,并使用HibernateTemplate。Web应用程序配置为使用 打开会话查看模块 .

    但是在我们的集成测试中,Hibernate会话被标记为 初始延迟关闭 在大多数情况下,这对我们的测试都很有效。有些服务函数在Web应用程序的上下文中工作良好,但在从测试工具调用时失败。

    例如:我有一个函数可以创建和更新事务中的多个对象。函数被标记为事务属性,但测试失败,并显示以下消息:

    Illegal attempt to associate a collection with two open sessions
    

    从Web应用程序调用时,事务成功完成

    我应该如何配置Spring和Hibernate,以便集成测试能够正确地复制Web应用程序的功能?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Marko Lahma    15 年前

    您应该在测试的安装部分创建一个sessionscope实例,然后在最后关闭(释放)它(拆卸)。这应该很好地模拟OSIV模型。下面是一个简化的示例:

    using System;
    using NHibernate;
    using NUnit.Framework;
    using Spring.Data.NHibernate.Support;
    
    [TestFixture]
    public class OsivKindOfTest
    {
        private SessionScope scope;
        // get LocalSessionFactoryObject from somewhere
        // see Spring.Testing.NUnit and auto-injection
        private ISessionFactory sessionFactory;
    
        [SetUp]
        public void OnSetUp()
        {
            scope = new SessionScope(sessionFactory, null, true, FlushMode.Never, true);
        }
    
        public void TestSomething()
        {
            // just a dummy demo
            Console.WriteLine(sessionFactory.GetCurrentSession().Statistics.EntityCount);
        }
    
        [TearDown]
        public void TearDown()
        {
            if (scope != null)
            {
                scope.Dispose();
            }
        }
    }
    

    此示例预期Spring的LocalSessionFactoryObject已将ExposeTransactionAwardeSessionFactory设置为true

        2
  •  1
  •   Tom Carter    15 年前

    我已经重写了集成测试夹具以从 抽象事务处理ldbProviderSpringContextTests 由Spring测试框架提供的类。

    这确实在自己的事务中运行每个测试,在测试结束时(默认情况下)回滚。除了解决两个开放会话的问题,我的测试运行得更快(不需要每次都清除数据库)。

    在使用Spring测试框架时要记住的一个重要点是,必须确保应用程序代码的Spring应用上下文和测试框架的Spring应用上下文是相同的,否则外部事务和内部事务将由两个不同的Hibernate会话工厂创建。

    推荐文章