5

当我为 Spring 应用程序运行测试用例(Junit)时,我遇到了这个错误。

我搜索了这个问题,我得到的信息是每当发生延迟初始化并且我的应用程序在会话关闭时尝试获取二级数据(对象分离)然后发生此错误,我们不能像它的性能一样进行初始化问题。

我的测试类包含:

@RunWith(SpringJUnit4ClassRunner.class)
public class MyTestClass extends AbstractControllerTest {

@Rule
public TestName testMethodName = new TestName();

    @Before
    public void setUp() throws Exception
    {
           super.setUp();
        }
       @After
    public void tearDown() throws Exception
    {
        super.tearDown();
         }
 @Test
  public void myTestMethod ()
 {
    assertTrue("Response Validating",validate(baseEntity,perform()));
 }

}

有没有办法可以把方法 assertTrue("Response Validating",validate(baseEntity,perform())); 在事务中可以与当前会话或新会话绑定,以便我的分离对象成为持久对象,然后我的应用程序也可以获得二级数据。我搜索了这个问题,并在链接上找到了解决方案: http ://www.jroller.com/RickHigh/entry/hibernate_spring_simulating_an_opensessioninviewfilter 但此链接不满足我的要求,因为它需要在其上创建事务的目标对象。

4

3 回答 3

17
@Test
@Transactional
public void myTestMethod ()
{
       assertTrue("Response Validating",validate(baseEntity,perform()));
}
于 2013-08-19T12:58:13.680 回答
9

myTestMethod使用注释@Transactional(假设您使用的是基于注释的配置)。

于 2013-08-19T12:56:15.413 回答
0

我得到了这个问题的解决方案。我在我的测试代码中实现了 OpenSessionInViewFilter 来克服这个问题,但是犯了一个愚蠢的错误。

请查看以下代码:

@Autowired
BeanFactory bf;

    @Before
        public void setUp() throws Exception
        {
             sessionFactory = (SessionFactory) bf.getBean("sessionFactory");
            Session session = SessionFactoryUtils.getSession(sessionFactory, true);
            session.setFlushMode(FlushMode.NEVER);
            TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
    }

    @After
        public void tearDown() throws Exception
        {
            super.tearDown();
            SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
            Session session = sessionHolder.getSession();
            SessionFactoryUtils.closeSession(session);

        } 

早些时候我没有使用 session.setFlushMode(FlushMode.NEVER)这是错误的。

顺便说一句谢谢

于 2013-08-20T12:45:35.673 回答