Wie soll ich Frühling werden die Konfiguration und überwintern, damit meine Integrationstests richtig das Verhalten der Web-Anwendung replizieren?

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

Frage

Wir haben eine Web-Anwendung basierend auf NSpring 1.2 und NHibernate 2 und verwenden HibernateTemplate. Die Web-Anwendung ist so konfiguriert, verwenden OpenSessionInViewModule .

In unseren Integrationstests jedoch die Hibernate-Session als markiert InitDeferredClose und zum größten Teil des funktioniert gut für unsere Tests. Es gibt einige Servicefunktionen, die im Rahmen der Web-Anwendung gut funktionieren, aber fehlschlagen, wenn von einem Testbaum genannt.

Zum Beispiel: Ich eine Funktion, die erstellt und aktualisiert eine Anzahl von Objekten innerhalb einer Transaktion. Die Funktion wird mit der Transaktion Attribute markiert, aber der Test fehl mit der Meldung:

Illegal attempt to associate a collection with two open sessions

Wenn Sie von der Web-Anwendung namens die Transaktion erfolgreich abgeschlossen

Wie soll ich Frühling werden die Konfiguration und überwintern, damit meine Integrationstests richtig die functionnality der Web-Anwendung replizieren?

War es hilfreich?

Lösung 2

Ich habe meine Integration Prüfvorrichtungen neu geschrieben von erben die AbstractTransactionalDbProviderSpringContextTests Klasse durch die Feder-Test-Framework zur Verfügung gestellt.

Dies führt in der Tat jeden Test in einer eigenen Transaktion mit einem (Standard) Rollback am Ende des Tests. Neben der Lösung des Problems von zwei offenen Sitzungen, meine Tests laufen viel schneller (keine Notwendigkeit, die Datenbank jedes Mal löschen).

Ein wichtiger Punkt im Auge zu behalten bei der Verwendung des Feder-Test-Framework ist, dass es notwendig ist, den Feder Anwendungskontext des Anwendungscodes, um sicherzustellen, und dass der Test-Framework ist ein und dasselbe sonst die äußeree Transaktion und die innere Transaktion würde durch zwei verschiedene Hibernate Session Fabriken erstellt werden

Andere Tipps

Sie sollten eine SessionScope Instanz im SetUp Teil des Tests erstellen und dann schließen (entsorgen) am Ende (TearDown). Dies sollte OSIV Modell recht gut nachahmen. Hier ist eine vereinfachte Beispiel:

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

In diesem Beispiel wird erwartet, dass Spring LocalSessionFactoryObject hat ExposeTransactionAwareSessionFactory auf true gesetzt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top