只是尋找一些建議真的如何在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秒才能加載應用程序上下文,當您必須多次運行測試時,最終會非常反效。
任何建議/提示將不勝感激。
我希望我很清楚,隨時提出任何問題。
在此先感謝
馬丁
感謝您的建議,但不幸的是,更新Spring版本目前並不是我們真正的選擇。我一定會看看XML配置文件的東西,看起來像一個方便的功能 –
@ masa-255如果更新不是您的選擇,您可以自己構建「配置文件解決方案」 - 就像我在[這](http://stackoverflow.com/questions/4593530/spring-unit-and-integration-tests/4593727#4593727)答案。 – FrVaBe