Spring/JUnit だけを使用して (DBUnit を使用せずに)、この問題を解決することができました。つまり、解決策はtransactionManager.getTransaction(def).setRollbackOnly();
@BeforeClass を呼び出すことでした。
最初に、私が何をしようとしているのかを説明しましょう。私の主な動機は、この流れに関するものでした。
1. トランザクションを開始します
。 2. ロード テスト データを挿入します
。 3. 同じテスト データに対して複数のテスト ケースを実行します
。 4. テスト データをロールバックします。
@BeforeClass で負荷テスト データを作成しているので、@AfterClass でロールバックしようとしていました。@BeforeClass でのみトランザクションをロールバックするように指示できるので、これは不要のようです。
だからここに私がそれをした方法があります:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/spring/applicationContext-services-test.xml")
@TestExecutionListeners(inheritListeners = false, listeners = { SpecialDependencyInjectionTestExcecutionListener.class })
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class loadTest {
...
private static HibernateTransactionManager transactionManager;
...
@BeforeClass
public static void setupDB() {
//- set the transaction to rollback only. We have to get a new transaction for that.
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
transactionManager.getTransaction(def).setRollbackOnly();
...
//- start loading the data using the injected services.
...
}
これは、クラスの最後にロールバックするのに役立ちました。
PS Theは、 @BeforeClass を呼び出す前に application.context を強制的にロードするために beforeTestClass をオーバーライドするために使用しSpecialDependencyInjectionTestExcecutionListener
た拡張機能です。DependencyInjectionTestExecutionListener
Dmitriy は、私が心に抱えていた別の問題を解決するためのヒントであったこのリスナーを強調しました。
ハイライトと提案を手伝ってくれたすべての人に感謝し、まとめてこの解決策に導きました.
ダフィール