¿Cómo debo configurará la primavera y de hibernación para que mis pruebas de integración replican adecuadamente el comportamiento de la aplicación web?

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

Pregunta

Tenemos una aplicación web basada en NSpring 1,2 y 2 NHibernate y usamos HibernateTemplate. La aplicación web está configurado para utilizar OpenSessionInViewModule .

En nuestras pruebas de integración sin embargo, la sesión de hibernación se marca como InitDeferredClose y en su mayor parte, esto funciona bien para nuestras pruebas. Hay algunas funciones de servicio que funcionan bien en el contexto de la aplicación web, pero fallan cuando se llama desde un instrumento de prueba.

Por ejemplo: Tengo una función que crea y actualiza un número de objetos dentro de una transacción. La función está marcado con el atributo de transacción, pero la prueba falla con el mensaje:

Illegal attempt to associate a collection with two open sessions

Cuando se llama desde la aplicación web de la transacción se completa correctamente

¿Cómo debo configurará la primavera y de hibernación para que mis pruebas de integración se replican correctamente la Funcionalidad de la aplicación web?

¿Fue útil?

Solución 2

he vuelto a escribir mis accesorios de la prueba de integración para heredar de la AbstractTransactionalDbProviderSpringContextTests clase proporcionada por el marco de pruebas de la primavera.

De hecho, esto se ejecuta cada prueba en su propia transacción con un rollback (por defecto) al final de la prueba. Además de resolver el problema de dos sesiones abiertas, mis pruebas se ejecutan mucho más rápido (no es necesario para borrar la base de datos cada vez).

Un punto importante a tener en cuenta cuando se utiliza el marco de pruebas de resorte es que es necesario para asegurar el contexto de aplicación de resorte del código de aplicación y la del marco de prueba son el uno y el mismo de otro modo la transacción exterior y el interior transacción sería creada por dos fábricas de hibernación sesión diferente

Otros consejos

Usted debe crear una instancia de sessionScope en la parte de configuración del ensayo y cierre (disponer) al final (TearDown). Esto debería imitar OSIV modelo bastante bien. He aquí una muestra simplificada:

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

Esta muestra espera que LocalSessionFactoryObject de primavera ha establecido ExposeTransactionAwareSessionFactory true

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top