Comment dois-je configurerez le printemps et hiverne afin que mes tests d'intégration répliquent correctement le comportement de l'application Web?

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

Question

Nous avons une application web basée sur NSpring 1.2 et NHibernate 2 et utiliser HibernateTemplate. L'application web est configuré pour utiliser OpenSessionInViewModule .

Dans nos tests d'intégration mais la session de mise en veille prolongée est marquée comme InitDeferredClose et pour la plupart cela fonctionne très bien pour nos tests. Il y a des fonctions de services qui fonctionnent bien dans le cadre de l'application Web, mais échouent lorsqu'il est appelé à partir d'un faisceau de test.

Par exemple: J'ai une fonction qui crée et met à jour un certain nombre d'objets dans une transaction. La fonction est marquée avec l'attribut de transaction, mais le test échoue avec le message:

Illegal attempt to associate a collection with two open sessions

Lorsqu'il est appelé à partir de l'application Web de la transaction se termine avec succès

Comment dois-je configurerez le printemps et hiverne afin que mes tests d'intégration répliquent correctement la fonctionnalité de l'application Web?

Était-ce utile?

La solution 2

Je l'ai réécrite mes appareils de test d'intégration à hériter de la AbstractTransactionalDbProviderSpringContextTests classe fournie par le cadre d'essais de printemps.

En effet fonctionne chaque test dans sa propre transaction avec un (par défaut) rollback à la fin du test. En plus de résoudre le problème de deux sessions ouvertes, mes tests courent beaucoup plus rapide (pas besoin de vider la base de données à chaque fois).

Un point important à garder à l'esprit lors de l'utilisation du framework de test ressort est qu'il est nécessaire d'assurer le contexte d'application de printemps du code d'application et du cadre de test sont l'une et la même sinon la transaction extérieure et l'intérieur transaction serait créé par deux différentes usines session Mise en veille prolongée

Autres conseils

Vous devez créer une instance SessionScope dans la partie reglage des tests puis fermez (disposer) à la fin (TearDown). Cela devrait imiter OSIV assez bien modèle. Voici un exemple simplifié:

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();
        }
    }
}

Cet exemple prévoit que LocalSessionFactoryObject de printemps a ExposeTransactionAwareSessionFactory valeur true

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top