В моей конфигурации Spring я просил оставить сеанс открытым в моих представлениях:
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="flushMode" value="0" />
</bean>
Однако этот компонент явно не рассматривает мои модульные тесты TestNG как представление. ;-) Все в порядке, но есть ли похожий компонент для модульных тестов, чтобы избежать страшного исключения LazyInitializationException во время модульного тестирования? Пока из-за этого умирает половина моих юнит-тестов.
Мой юнит-тест обычно выглядит так:
@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, есть ли лучшие способы сделать это, или это способ сделать это, и в таком случае, что я неправильно понял?
Приветствия
Nik