Hibernate Maven Spring测试在一起运行时失败,但单独成功(ehcache关闭,IllegalTransactionStateException)

Hibernate Maven Spring测试在一起运行时失败,但单独成功(ehcache关闭,IllegalTransactionStateException),hibernate,spring,maven-2,junit,Hibernate,Spring,Maven 2,Junit,我们正在对一个相当大的web应用程序使用Maven/Surefire和Spring/Hibernate事务测试。共有138个测试*类,总共运行1178个测试 简单的mvn测试将生成82个错误,其性质往往意味着应用程序上下文已损坏: 其中许多: IllegalTransactionStateException: Pre-bound JDBC Connection found! NoSuchMethodError: org.hibernate.cache.CacheException.<in

我们正在对一个相当大的web应用程序使用Maven/Surefire和Spring/Hibernate事务测试。共有138个测试*类,总共运行1178个测试

简单的
mvn测试将生成82个错误,其性质往往意味着应用程序上下文已损坏:

其中许多:

IllegalTransactionStateException: Pre-bound JDBC Connection found!
NoSuchMethodError: org.hibernate.cache.CacheException.<init>(Ljava/lang/Exception;)V
其中一些:

IllegalTransactionStateException: Pre-bound JDBC Connection found!
NoSuchMethodError: org.hibernate.cache.CacheException.<init>(Ljava/lang/Exception;)V
NoSuchMethodError:org.hibernate.cache.CacheException.(Ljava/lang/Exception;)V
对于每个失败的测试,单独运行测试类将成功。事实上,使用-
Dtest=TestClass1、TestClass2等
处理我所有测试类的不同子集会以不同的方式成功或失败。例如,仅运行失败的测试类会成功,并出现0个错误

由于没有明显的方法来控制Surefire测试的类的顺序,我很难确定我的测试类中的哪些似乎处于不好的状态

我要寻找的是一种策略,以某种确定性的方式帮助确定正在发生的事情。我当然可以从日志中看到测试运行的顺序,但我无法可控地再现该顺序

当然,关于如何处理它的建议

由于没有明显的方法来控制Surefire测试的类的顺序,我很难确定我的测试类中的哪些似乎处于不好的状态

的确如此。运行测试子集将产生不同的结果(从执行顺序的角度来看),这使得调试问题变得非常困难


但是您可以使用来自的补丁(按字母顺序运行测试)来获得更好的控制(查看评论,其中一张海报面临与您非常相似的问题)。

事实上,问题来自损坏的Spring应用程序上下文。早期的测试之一是弄脏上下文并导致以下测试出错

一个困难是试图控制测试的顺序,同时发现导致故障的测试

我能够通过使用Maven的日志找到测试类运行的顺序,然后从顶部一次排除一个测试来实现这一点。在34次测试中,我找到了罪犯

这是一个叫做TestSpringContexts的测试。将@DirtiesContext添加到这些测试中可以解决问题,但也可以通过从测试中删除对context.close()的调用来解决问题

我在这里写了一篇关于这个过程的博文,但这就是问题的要点:

Mojo

在每个测试用例中添加
@DirtiesContext(classMode=DitiesContext.classMode.AFTER\u CLASS)


@DirtiesContext
来自包
org.springframework.test.annotation

您使用哪个Spring和JUnit版本?您的测试是从AbstractJUnit4SpringContextTests还是AbstractTransactionalJUnit4SpringContextTests继承的?Spring 2.5、JUnit4.4,以及大部分AbstractAnnotationAwareTransactionalTests,尽管我怀疑存在版本蠕变。较新的测试类可以从较新的Spring脚手架扩展而来。目前我还没有研究过所有138个测试类。