如何将事务添加到wicket+;弹簧&x2B;用于junit测试的hibernate应用程序
嗨,我在运行junit测试时遇到了以下问题如何将事务添加到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
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());
}
}