在我的 Spring 配置中,我要求 session 在我的 View 中保持打开状态:
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="flushMode" value="0" />
</bean>
但是,这个 bean 显然不将我的 TestNG 单元测试视为 View 。 ;-) 没关系,但是是否有用于单元测试的类似 bean,以便我在单元测试时避免可怕的 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 的东西,是否有更好的方法来做到这一点,或者这是这样做的方法,在那种情况下我误解了什么?
干杯
尼克
最佳答案
我使用 JUnit 进行测试,因此您需要将以下示例改编为 TestNG。我个人使用 SpringJUnit4ClassRunner 在基测试类中绑定(bind)事务:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext-struts.xml")
@TransactionConfiguration(transactionManager = "transactionManager")
@Transactional
public abstract class BaseTests {
在“@Before”中,我在 RequestContextHolder 中注入(inject)了一个 MockHttpServletRequest:
@Before
public void prepareTestInstance() throws Exception {
applicationContext.getBeanFactory().registerScope("session", new SessionScope());
applicationContext.getBeanFactory().registerScope("request", new RequestScope());
MockHttpServletRequest request = new MockHttpServletRequest();
ServletRequestAttributes attributes = new ServletRequestAttributes(request);
RequestContextHolder.setRequestAttributes(attributes);
.......
我从 manual 中获取了信息
关于java - LazyInitializationException,同时使用 TestNG 对 Hibernate 实体类进行单元测试以在 Spring 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1543515/