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)

私のバージョン:

hibernate4.0.0CR7スプリング3.1CR2ウィケット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テストでは、現在のスレッドのセッションが見つかりませんが、ウィケットテスターを使用すると問題が発生します。

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

たぶん、あなたはあなたの改札ページをテストし、あなたのために追加のテストを書くためにモックダオスを使うべきです。いくつかの巨大なテストケースの代わりに、より小さなテストを作成する方がはるかに簡単で便利です。

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

于 2011-12-08T22:52:23.210 に答える