5

複数のスレッドを実行する単純な単体テストが必要です。つまり、メイン スレッドがデータベースへの保存をコミットし、セカンダリ スレッドがそれを取得するのを待ちます。

2 番目のスレッドがデータベースにクエリを実行してアイテムを検索できるようにするには、トランザクションをコミットする必要があることがわかりました。そうでなければ、それは存在しません。

H2 データベース、Hibernate を使用してアクセスを管理し、単体テストを拡張して、これを達成しようとしていますAbstractTransactionalJUnit4SpringContextTests

commit()既存のトランザクションを試すと:

... // Create and save our model object

sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().beginTransaction();

... // Create and start second Thread, query, etc.

次のエラーが表示されます。

org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:484)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:521)`

しかし、アノテーションのみを拡張AbstractJUnit4SpringContextTestsして使用しようとすると、次のようになります。@Transactional

@TransactionConfiguration(defaultRollback=false, transactionManager="transactionManager")
@Transactional()
public class DatabaseIntegrityTest extends AbstractJUnit4SpringContextTests {

上記と同じコミット コードを使用すると、次のようになります。

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:1041)

への最初の通話中getCurrentSession()

JUnit Transactional Spring テストの途中でコミットする方法はありますか?

さらに、 を使用して独自のネストされたトランザクションを作成しようとすると、次のメッセージが表示されAbstractTransactionalJUnit4SpringContextTestsます。

org.hibernate.TransactionException: nested transactions not supported
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152)
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1396)

回答付きで編集:

のおかげでaxtavt、次の方法で問題を解決できました。

1) 延長AbstractJUnit4SpringContextTests

2) に @Autowired を使用するPlatformTransactionManager:

   @Autowired
   protected PlatformTransactionManager transactionManager;

3)トランザクションコードを内部に入れる:

TransactionStatus status = transactionManager.getTransaction(null);
... // The Model-Saving Code
transactionManager.commit(status);
4

1 に答える 1

9

したがって、テスト メソッド内に複数のトランザクションを作成する必要があります。ご覧のとおり、 はAbstractTransactionalJUnit4SpringContextTestsテスト メソッド全体に対して 1 つのトランザクションを作成するため使用できませんAbstractJUnit4SpringContextTests。また、トランザクションをまったく作成しないため、bare は使用できません。

AbstractJUnit4SpringContextTests解決策は、テスト メソッド内のトランザクションをプログラムで使用および管理することです。

11.6 プログラムによるトランザクション管理PlatformTransactionManagerで説明されているように、テストに注入し、そこから作成TransactionTemplateし、それを使用してトランザクションを区別する必要があります。

于 2013-04-12T20:03:08.860 に答える