Come dovrei configurando la primavera e Hibernate in modo che i miei test di integrazione replicare correttamente il comportamento dell'applicazione Web?

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

Domanda

Abbiamo un'applicazione web basata su NSpring 1.2 e NHibernate 2 e usiamo HibernateTemplate. L'applicazione web è configurato per utilizzare OpenSessionInViewModule .

Nei nostri test di integrazione tuttavia la sessione Hibernate è contrassegnato come InitDeferredClose e per la maggior parte questo funziona bene per i nostri test. Ci sono alcune funzioni di servizio che funzionano bene nel contesto dell'applicazione web, ma non riescono quando viene chiamato da un test harness.

Ad esempio: Ho una funzione che crea e aggiorna una serie di oggetti all'interno di una transazione. La funzione è contrassegnato con l'attributo di transazione, ma la prova non riesce con il messaggio:

Illegal attempt to associate a collection with two open sessions

Quando viene chiamato da l'applicazione web al completamento della transazione con successo

Come dovrei configurando la primavera e Hibernate in modo che i miei test di integrazione replicare adeguatamente il functionnality dell'applicazione Web?

È stato utile?

Soluzione 2

Ho riscritto la mia integrazione attrezzature di prova di ereditare dal AbstractTransactionalDbProviderSpringContextTests di classe fornito dal framework di test di primavera.

Questo viene eseguito in effetti ogni test nella propria transazione con un (per impostazione predefinita) rollback alla fine del test. Oltre a risolvere il problema delle due sessioni aperte, i miei test eseguiti molto più veloce (non c'è bisogno di cancellare il database ogni volta).

Un punto importante da tenere a mente quando utilizza il framework di test molla è che è necessario garantire il contesto applicativo molla del codice dell'applicazione e quello del quadro di prova sono l'unico e medesimo altrimenti la transazione esterno e l'interno transazione sarebbe stato creato da due diverse fabbriche Hibernate Session

Altri suggerimenti

Si dovrebbe creare un'istanza SessionScope nella sezione sulla configurazione di prova e quindi chiudere (smaltire) alla fine (tearDown). Questo dovrebbe imitare OSIV modello abbastanza bene. Ecco un esempio semplificato:

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

Questo campione si aspetta che LocalSessionFactoryObject di primavera è ExposeTransactionAwareSessionFactory impostata su true

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top