2011-08-22 114 views
0

只是尋找一些建議真的如何在Spring 3.0.2上使用JUnit4進行「單元」測試& Hibernate 3.2.7 web應用程序。JUnit4,Spring,Hibernate測試環境設置

我們目前有超過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(「服務名」)註釋,並@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

春3.1將引入XML Profiles - 這可以是一個很好的辦法如何通過不同的測試設置工作。今年應該是released--儘管它們已經推遲發佈RC1。不過,我會試試Milestone發行版(我已經做過)。

+0

感謝您的建議,但不幸的是,更新Spring版本目前並不是我們真正的選擇。我一定會看看XML配置文件的東西,看起來像一個方便的功能 –

+0

@ masa-255如果更新不是您的選擇,您可以自己構建「配置文件解決方案」 - 就像我在[這](http://stackoverflow.com/questions/4593530/spring-unit-and-integration-tests/4593727#4593727)答案。 – FrVaBe