我设法仅使用 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 这SpecialDependencyInjectionTestExcecutionListener
是DependencyInjectionTestExecutionListener
我用来覆盖 beforeTestClass 以强制在调用 @BeforeClass 之前加载 application.context 的扩展。归功于 Dmitriy 强调了这个 Listener,这是解决我脑海中另一个问题的提示。
感谢所有帮助突出显示和建议的人,这些人共同引导我找到了这个解决方案。
达菲尔