Как добавить транзакцию в приложение wicket + spring + hibernate для теста junit - PullRequest
1 голос
/ 05 декабря 2011

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

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

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Привет, я нашел решение.

Я решил стимулировать открытую сессию в моем тесте.

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

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

0 голосов
/ 09 декабря 2011

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

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

...