关于如何在Spring 3.0.2&amp ;;上使用JUnit4设置“单元”测试,我们真的想了解一些建议。 Hibernate 3.2.7网络应用程序。
我们目前只有超过500个测试分布在75个以上的课程中。
我们的测试类设置(注释)类似于下面的类:
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration
@Transactional
@ContextConfiguration(locations={"/location/of/SomeServiceTest-context.xml"}, inheritLocations=false)
public class SomeServiceTest extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
protected SomeService someService;
@Test
public void testSomeServiceMethod() {}
@Test
public void testAnotherServiceMethod() {}
}
我们的“服务”对象使用@Service(“serviceName”)进行注释,并具有@Autowired(受保护)依赖项,这些依赖项可以是其他服务或DAO(使用@Repository(“daoName”)注释)。
以前,我们对大多数测试类都有不同的上下文。每个上下文仅包含该类中测试所需的bean,因此我们可以单独测试应用程序的各个部分。我们创建的AutoBeanDeclarer将自动模拟上下文中未定义的依赖项,受到本文关于DZone的启发:Automatically Inject Mocks into Spring Context
当我们单独运行测试类时,这种设置工作正常。当我们试图同时运行所有500多个测试时,我们遇到了
java.lang.OutOfMemoryError: GC overhead limit exceeded
在进行了一些挖掘(和分析)后,我们发现内存泄漏,如本文所述:Application ClassLoader’s Footprint Memory Leak in Shared Containers。简而言之,我们已经加载了多个应用程序上下文的设置,并且由于附加到ClassLoader,它们不是垃圾收集的。所以我们有一堆(SessionFactory)对象,这些对象不是垃圾收集器,而是保留在内存中。
我们将设置更改为使用所有测试类使用的单个完整应用程序上下文(定义了所有bean)。这适用于两种情况;当单独运行测试并一起运行所有测试时。
但是,我们希望通过此设置克服一些问题:
主要问题是这个设置不允许我们单独测试应用程序的部分内容,因为所有bean及其依赖项都是在应用程序上下文中定义的,而不是模拟的。
第二个问题是,当我们运行单独的测试时,加载应用程序上下文需要30-40秒,当你必须多次运行测试时,这最终会产生相反的效率。
任何建议/提示将不胜感激。
我希望我很清楚,随时提出任何问题。
提前致谢
马丁
答案 0 :(得分:0)
Spring 3.1将介绍XML Profiles - 这对于如何使用不同的测试设置是一个很好的方法。今年应该是released - 尽管他们已经推迟发布RC1。不过我会试试里程碑(我已经做过)。