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

标签 java unit-testing hibernate spring testng

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

相关文章:

java - 具有 LEAST 和 GREATEST 函数的 JPA CriteriaQuery

java - ArrayList只存储一个对象

C++ 单元测试 : Stubs (not mocks)?

java - Hibernate 事务回滚是否会删除 "session.flush()"ed 实体?

javascript - 使用 JSDOM 加载现有的 HTML 文件以进行前端单元测试

java - 如何通过测试 Java 中指定复杂程度的方法来检查代码覆盖率

java - 如何使用子查询而不是连接查询来通过 hibernate 获得正确的计数

java - Int 到 byteArray

java - Dockerfile授予hdfs权限

java - 转换日期时间并插入 MySQL