私のSpring構成では、ビューでセッションを開いたままにするように依頼しました。
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="flushMode" value="0" />
</bean>
ただし、この Bean は明らかに私の TestNG 単体テストをビューとは見なしません。;-) 大丈夫ですが、単体テスト中に恐ろしい LazyInitializationException を回避できるように、単体テスト用の同様の Bean はありますか? これまでのところ、私の単体テストの半分はそれが原因で死んでいます。
私の単体テストは通常次のようになります。
@ContextConfiguration({"/applicationContext.xml", "/applicationContext-test.xml"})
public class EntityUnitTest extends AbstractTransactionalTestNGSpringContextTests {
@BeforeClass
protected void setUp() throws Exception {
mockEntity = myEntityService.read(1);
}
/* tests */
@Test
public void LazyOneToManySet() {
Set<SomeEntity> entities = mockEntity.getSomeEntitySet();
Assert.assertTrue(entities.size() > 0); // This generates a LazyInitializationException
}
}
setUp() を次のように変更してみました:
private SessionFactory sessionFactory = null;
@BeforeClass
protected void setUp() throws Exception {
sessionFactory = (SessionFactory) this.applicationContext.getBean("sessionFactory");
Session s = sessionFactory.openSession();
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(s));
mockEntity = myEntityService.read(1);
}
しかし、これは間違った方法だと思います。後でテストするためにトランザクションを台無しにします。OpenSessionInTestInterceptor のようなものはありますか、これを行うためのより良い方法はありますか、それともこれを行う方法ですか?その場合、私はそれについて何を誤解しましたか?
乾杯
ニック