如何将事务添加到wicket+;弹簧&x2B;用于junit测试的hibernate应用程序

如何将事务添加到wicket+;弹簧&x2B;用于junit测试的hibernate应用程序,hibernate,spring,session,wicket,transactional,Hibernate,Spring,Session,Wicket,Transactional,嗨,我在运行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.getCurren

嗨,我在运行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)
我的版本:

hibernate 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驱动

<tx:annotation-driven transaction-manager="test.transactionManager" />
<bean id="test.transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
autowire="byType" />
我的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);
}
注入工作,但事务设置似乎不工作

怎么了?解决这个问题的最好办法是什么。我不喜欢使用hibernate模板,而是保持一种非侵入性的hibernate方法


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

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


你好,我找到了解决办法

我决定在测试中刺激开放式会话

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());
     }
}

因此,这将用于测试中的应用

您好,谢谢,但我正在尝试使用spring、hibernate和wicket运行集成环境测试,我希望能够以编程方式添加事务。您能帮我解决类似的问题吗?
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());
     }
}