1

嗨,我在运行 junit 测试时遇到以下问题。

org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:881)
at com.user.dao.UserDaoHibernateImpl.getUserByName(UserDaoHibernateImpl.java:40)
at com.user.service.UserServiceImpl.getUserName(UserServiceImpl.java:67)

我的版本:

休眠 4.0.0 CR7 弹簧 3.1 CR2 检票口 1.5.3

@TransactionConfiguration(transactionManager = "test.transactionManager")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext-test.xml"})
public class AccountPageTestCase extends AbstractTransactionalJUnit4SpringContextTests 
{
          private WicketTester                tester;
          @Test
          public void signInUserMustGoToAccountPage() {
          this.tester.startPage(AccountPage.class, new PageParameters());

          final FormTester formTester =   this.tester.newFormTester(AuthenticatedTestApplication.SIGN_IN_FORM_PATH);
          formTester.setValue("username", AccountPageTestCase.TEST_USER);
          formTester.setValue("password", AccountPageTestCase.TEST_USER);
          formTester.setValue("rememberMeRow:rememberMe", false);
          formTester.submit();

          this.tester.assertRenderedPage(AccountPage.class);

          this.tester.clickLink("accountBody:" +  AuthenticatedTestApplication.SIGN_OUT_PANEL_PATH);
        }
    }

我在这里添加了 tx:annotation-driven 。

<tx:annotation-driven transaction-manager="test.transactionManager" />
<bean id="test.transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
autowire="byType" />

所以我的 getUserByName 代码

@Override
@Transactional(propagation = Propagation.SUPPORTS,
           readOnly = true)
public User getUserByName(final String displayName) {
    return this.userDao.getUserByName(displayName);
}

我的 accountpage 构造函数。

@SpringBean(name = "userService")
private transient UserService userService;

public AccountPage(final PageParameters pageParameters) {
        final String userName = pageParameters.get("name").toString(StringUtils.EMPTY);
        final User user = this.userService.getUserByName(userName);
}

注入有效,但事务设置似乎不起作用。

怎么了?解决问题的最佳方法是什么。我不喜欢使用休眠模板并保持非侵入性休眠方法。

我的 spring+hibernate 测试没有为当前线程找到没有会话,但是如果我使用 wicket 测试器,我就会遇到问题。

4

2 回答 2

2

嗨,我找到了解决方案。

我决定在我的测试中激发开放会话。

public void TestApp extends AuthenticatedWebApplication  {
     @Override 
     public void init() {
       // open session in view for testing.
        final SessionFactory sessionFactory = AuthenticatedTestApplication.context.getBean("sessionFactory", SessionFactory.class);
        final Session s = sessionFactory.openSession();
        TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(s));
     }

     @Override
     protected void onDestroy() {
        super.onDestroy();
        final SessionFactory sessionFactory = AuthenticatedTestApplication.context.getBean("sessionFactory", SessionFactory.class);
        final SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
        SessionFactoryUtils.closeSession(sessionHolder.getSession());
     }
}

所以这将用于测试中的应用。

于 2012-01-04T14:42:33.327 回答
0

也许你应该使用模拟 daos 来测试你的 wicket 页面并为你的 daos 编写额外的测试。创建更多更小的测试而不是几个巨大的测试用例更容易也更有用。

https://cwiki.apache.org/WICKET/spring.html#Spring-Uni​​tTestingtheProxyApproach

于 2011-12-08T22:52:23.210 回答