統合テストで Web アプリケーションの動作を適切に複製するには、Spring と Hibernate をどのように構成すればよいですか?
-
11-09-2019 - |
質問
NSpring 1.2 および NHibernate 2 に基づいた Web アプリケーションがあり、HibernateTemplate を使用しています。Web アプリケーションは使用するように構成されています OpenSessionInViewModule.
ただし、統合テストでは、休止状態セッションは次のようにマークされます。 InitDeferredClose ほとんどの場合、これはテストではうまく機能します。Web アプリケーションのコンテキストでは正常に動作しても、テスト ハーネスから呼び出すと失敗するサービス関数がいくつかあります。
例えば :トランザクション内で多数のオブジェクトを作成および更新する関数が 1 つあります。関数は Transaction 属性でマークされていますが、テストは次のメッセージで失敗します。
Illegal attempt to associate a collection with two open sessions
Web アプリケーションから呼び出されると、トランザクションは正常に完了します
統合テストで Web アプリケーションの機能を適切に複製するには、Spring と Hibernate をどのように構成すればよいですか?
解決 2
私は、春のテストフレームワークが提供するの AbstractTransactionalDbProviderSpringContextTests のクラスから継承するために私の統合テスト・フィクスチャを書き換えています。
これは実際に試験終了時(デフォルト)のロールバックを持つ独自のトランザクション内の各テストを実行します。別に2つのオープンセッションの問題を解決するから、私のテストはたくさん速く(データベースを毎回クリアする必要はありません)を実行します。
スプリングテストフレームワークを使用するときに心に留めておくべき重要な点は、アプリケーションコードのばねアプリケーションコンテキストを確保する必要があるということであり、テストフレームワークの一と同じさもなければ外側トランザクションおよび内側でありますトランザクションは、2つの異なるHibernateのSessionファクトリーによって作成されます。
他のヒント
テストの SetUp 部分で SessionScope インスタンスを作成し、最後に閉じる (破棄) (TearDown) 必要があります。これは OSIV モデルをよく模倣するはずです。簡略化したサンプルを次に示します。
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();
}
}
}
このサンプルでは、Spring の LocalSessionFactoryObject の ExposeTransactionAwareSessionFactory が true に設定されていることを想定しています。