5

Spring アプリケーションのテスト ケース (Junit) を実行すると、このバグが発生します。

この問題を検索したところ、遅延初期化が発生し、セッションが閉じている間にアプリケーションが第 2 レベルのデータを取得しようとすると (オブジェクトが切り離された状態になる)、このエラーが発生すると、そのパフォーマンスとして EAGER として初期化を行うことができないという情報が得られました。問題。

私のテストクラスには以下が含まれます:

@RunWith(SpringJUnit4ClassRunner.class)
public class MyTestClass extends AbstractControllerTest {

@Rule
public TestName testMethodName = new TestName();

    @Before
    public void setUp() throws Exception
    {
           super.setUp();
        }
       @After
    public void tearDown() throws Exception
    {
        super.tearDown();
         }
 @Test
  public void myTestMethod ()
 {
    assertTrue("Response Validating",validate(baseEntity,perform()));
 }

}

メソッド assertTrue("Response Validating",validate(baseEntity,perform())); を置く方法はありますか? トランザクションでは、現在のセッションまたは新しいセッションとバインドできるため、切り離されたオブジェクトが永続オブジェクトになり、アプリケーションが第 2 レベルのデータも取得できます。私はこの問題を検索し、リンクで解決策を見つけました: http://www.jroller.com/RickHigh/entry/hibernate_spring_simulating_an_opensessioninviewfilter しかし、このリンクはトランザクションが作成されるターゲットオブジェクトを必要とするため、私の要件を満たしていません。

4

3 に答える 3

17
@Test
@Transactional
public void myTestMethod ()
{
       assertTrue("Response Validating",validate(baseEntity,perform()));
}
于 2013-08-19T12:58:13.680 に答える
0

この問題の解決策を得ました。この問題を克服するためにテスト コードに OpenSessionInViewFilter を実装していましたが、愚かな間違いを犯していました。

次のコードを見てください:

@Autowired
BeanFactory bf;

    @Before
        public void setUp() throws Exception
        {
             sessionFactory = (SessionFactory) bf.getBean("sessionFactory");
            Session session = SessionFactoryUtils.getSession(sessionFactory, true);
            session.setFlushMode(FlushMode.NEVER);
            TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
    }

    @After
        public void tearDown() throws Exception
        {
            super.tearDown();
            SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
            Session session = sessionHolder.getSession();
            SessionFactoryUtils.closeSession(session);

        } 

以前はこれを使用していなかっ session.setFlushMode(FlushMode.NEVER)たのが間違いでした。

ところで、ありがとう

于 2013-08-20T12:45:35.673 に答える