当我为Spring应用程序运行测试用例(Junit)时,我遇到了这个错误。
我搜索了这个问题,我得到的信息是,每当发生延迟初始化并且我的应用程序在会话关闭时尝试获取第二级数据(对象变得分离)然后发生此错误,我们无法进行初始化为EAGER因为它的性能问题。
我的测试类包含:
@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 但是这个链接不符合我的要求,因为它需要创建事务的目标对象。
答案 0 :(得分:4)
@Test
@Transactional
public void myTestMethod ()
{
assertTrue("Response Validating",validate(baseEntity,perform()));
}
答案 1 :(得分:2)
使用myTestMethod
注释@Transactional
(假设您使用的是基于注释的配置)。
答案 2 :(得分: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)
这是错误的。
顺便说一句,谢谢