Как добавить транзакцию в приложение wicket + spring + hibernate для теста junit

Привет, у меня возникла следующая проблема при запуске теста 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);
}

Конструктор моей учетной записи.

@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 нет сеанса, найденного для текущего потока, но если я использую тестер калитки, у меня возникает проблема.


person Chun ping Wang    schedule 05.12.2011    source источник


Ответы (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());
     }
}

так что это будет использоваться для приложения в тестировании.

person Chun ping Wang    schedule 04.01.2012
comment
Можете ли вы помочь мне с аналогичной проблемой здесь? - person Kevin Rave; 06.11.2014

Возможно, вам следует использовать фиктивные даосы, чтобы протестировать свою страницу калитки и написать дополнительные тесты для своих даосов. Гораздо проще и полезнее создавать больше небольших тестов вместо нескольких огромных тестовых случаев.

https://cwiki.apache.org/WICKET/spring.html#Spring-UnitTestingtheProxyApproach

person Till    schedule 08.12.2011
comment
привет, спасибо, но я пытаюсь запустить тест среды интеграции с помощью spring, hibernate и wicket, и я хочу иметь возможность программно добавлять транзакцию. - person Chun ping Wang; 13.12.2011