Как мне настроить Spring и Hibernate, чтобы мои интеграционные тесты правильно воспроизводили поведение веб-приложения?

StackOverflow https://stackoverflow.com/questions/1833339

Вопрос

У нас есть веб-приложение на основе Nspring 1.2 и NHibernate 2, в котором мы используем HibernateTemplate.Веб-приложение настроено для использования Опенсессионинвиевмодуле.

Однако в наших интеграционных тестах сеанс гибернации помечен как InitDeferredClose и по большей части это отлично работает для наших тестов.Есть некоторые сервисные функции, которые нормально работают в контексте веб-приложения, но не работают при вызове из тестовой среды.

Например :У меня есть одна функция, которая создает и обновляет несколько объектов в транзакции.Функция помечена атрибутом Transaction, но тест завершается неудачей с сообщением:

Illegal attempt to associate a collection with two open sessions

При вызове из веб-приложения транзакция завершается успешно.

Как мне настроить Spring и Hibernate, чтобы мои интеграционные тесты правильно воспроизводили функциональность веб-приложения?

Это было полезно?

Решение 2

Я переписал свои приспособления для интеграционных тестов, чтобы они наследовались от AbstractTransactionalDbProviderSpringContextTests класс, предоставляемый средой тестирования Spring.

Это действительно запускает каждый тест в отдельной транзакции с откатом (по умолчанию) в конце теста.Помимо решения проблемы двух открытых сессий, мои тесты выполняются намного быстрее (не нужно каждый раз очищать базу данных).

Важным моментом, который следует учитывать при использовании среды тестирования Spring, является то, что необходимо обеспечить, чтобы контекст приложения Spring кода приложения и контекст тестовой среды были одинаковыми, иначе внешняя транзакция и внутренняя транзакция будут одинаковыми. созданный двумя разными фабриками сеансов Hibernate

Другие советы

Вам следует создать экземпляр SessionScope в части теста SetUp, а затем закрыть (утилизировать) его в конце (TearDown).Это должно очень хорошо имитировать модель 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top