JUnit4,Spring,Hibernate测试上下文设置

时间:2011-08-22 09:15:14

标签: hibernate unit-testing spring junit4

关于如何在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秒,当你必须多次运行测试时,这最终会产生相反的效率。

任何建议/提示将不胜感激。

我希望我很清楚,随时提出任何问题。

提前致谢

马丁

1 个答案:

答案 0 :(得分:0)

Spring 3.1将介绍XML Profiles - 这对于如何使用不同的测试设置是一个很好的方法。今年应该是released - 尽管他们已经推迟发布RC1。不过我会试试里程碑(我已经做过)。