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

Nhibernate 我应该如何配置spring和hibernate,以便我的集成测试能够正确地复制Web应用程序的行为?,nhibernate,web-applications,integration-testing,spring.net,Nhibernate,Web Applications,Integration Testing,Spring.net,我们有一个基于NSpring 1.2和NHibernate 2的web应用程序,并使用HibernateTemplate。web应用程序配置为使用OpenSessionInViewModule 然而,在我们的集成测试中,hibernate会话被标记为InitDeferredClose,在大多数情况下,这对我们的测试来说都很好。有些服务功能在web应用程序的上下文中工作正常,但从测试工具调用时失败 例如:我有一个函数,用于在事务中创建和更新多个对象。该函数用事务属性标记,但测试失败,并显示以下消息

我们有一个基于NSpring 1.2和NHibernate 2的web应用程序,并使用HibernateTemplate。web应用程序配置为使用OpenSessionInViewModule

然而,在我们的集成测试中,hibernate会话被标记为InitDeferredClose,在大多数情况下,这对我们的测试来说都很好。有些服务功能在web应用程序的上下文中工作正常,但从测试工具调用时失败

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

Illegal attempt to associate a collection with two open sessions
从web应用程序调用时,事务将成功完成


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

您应该在测试的设置部分创建一个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将ExposeTransactionAwareSessionFactory设置为true

我已重写了集成测试装置,以继承Spring测试框架提供的AbstractTransactionalDbProviderSpringContextTests

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


使用spring测试框架时需要记住的一点是,必须确保应用程序代码的spring应用程序上下文和测试框架的spring应用程序上下文是相同的,否则外部事务和内部事务将由两个不同的Hibernate会话工厂创建测试期间是否可能没有打开的事务?您是否使用Spring中的集成测试助手类?您是否尝试过为Spring和NHibernate启用日志记录以查看幕后发生了什么(事务方面)?如果你没有得到足够的答案,也许你也应该在邮件中询问。我还没有机会与OSIV合作:-(没有开放的交易会导致问题。请参阅公认的答案-感谢您的帮助+1