Como eu deveria estar a configuração Spring e Hibernate para que meus testes de integração replicar corretamente o comportamento da aplicação Web?

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

Pergunta

Nós temos uma aplicação web baseada em NSpring 1.2 e NHibernate 2 e uso HibernateTemplate. A aplicação web está configurado para uso OpenSessionInViewModule .

Em nossos testes de integração no entanto a sessão de hibernação está marcada como InitDeferredClose e, na maior parte esta multa trabalha para nossos testes. Existem algumas funções de serviços que funcionam bem no contexto da aplicação web, mas falham quando chamado a partir de um equipamento de teste.

Por exemplo: Eu tenho uma função que cria e atualiza um número de objetos dentro de uma transação. A função é marcado com o atributo de transação, mas o teste falhar com a mensagem:

Illegal attempt to associate a collection with two open sessions

Quando chamado a partir da aplicação web os concluída transação com sucesso

Como eu deveria estar a configuração Spring e Hibernate para que meus testes de integração replicar corretamente o Funcionalidades de da aplicação Web?

Foi útil?

Solução 2

Eu tenho reescrito meus dispositivos de teste de integração para herdar o AbstractTransactionalDbProviderSpringContextTests classe fornecido pelo framework de testes da Primavera.

Este fato é executado cada teste em sua própria transação com um (por padrão) reversão no final do teste. Além de resolver o problema de duas sessões abertas, meus testes correr muito mais rápido (não há necessidade de limpar a base de dados de cada vez).

Um ponto importante a ter em mente ao usar o framework de testes primavera é que é necessário para assegurar o contexto de aplicação Primavera do código do aplicativo e que do quadro de teste são a um só e mesmo caso contrário, a transação externo eo interno transação seria criado por duas fábricas de sessão Hibernate diferentes

Outras dicas

Você deve criar uma instância SessionScope na parte configuração do teste e feche (descarte) no final (TearDown). Isso deve imitar modelo OSIV muito bem. Aqui está um exemplo simplificado:

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

Este exemplo espera que LocalSessionFactoryObject da Primavera definiu ExposeTransactionAwareSessionFactory para true

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top