gpt4 book ai didi

java - LazyInitializationException,同时使用 TestNG 对 Hibernate 实体类进行单元测试以在 Spring 中使用

转载 作者:行者123 更新时间:2023-11-29 06:47:52 24 4
gpt4 key购买 nike

在我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com