2013-01-17 55 views
1

我有一個Maven web項目我想執行一些JUnit集成測試。爲了實現這一點,我想加載applicationContext.xml文件來獲取Spring注入的bean。此外,我的應用程序上下文文件位於src/main/resources/app_context中,但執行Maven的生命週期時,它將它們定位到WEB-INF/classes/application_context,因此我可以通過類路徑訪問它們。如何在Maven測試中加載Spring應用程序上下文

<resource> 
    <directory>src/main/resources/appcontext</directory> 
    <targetPath>${basedir}/src/main/webapp/WEB-INF/classes/application_context</targetPath> 
    <filtering>true</filtering> 
    <includes> 
     <include>*/**</include> 
    </includes> 
</resource> 

我試圖在某些方面訪問該上下文,但沒有成功。我也把它們放入Maven的目標test目錄那樣:

<testResources> 
    <testResource> 
     <directory> 
       src/main/resources/appcontext 
      </directory> 
     <targetPath>${basedir}/src/main/webapp/WEB-INF/classes/application_context</targetPath> 
    </testResource> 
</testResources> 

這是我的一塊試驗:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:**/applicationContext.xml" }) 
@Transactional 
public class SystemTest { 

    @Autowired 
    ApplicationContext applicationContext; 

    @Test 
    public void initializeSystemTest() { 
      //Test code 

這就是我如何可以訪問應用程序上下文的其餘部分從我的主要文件之一:

<?xml version="1.0" encoding="ISO-8859-15"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:cxf="http://cxf.apache.org/core" xmlns:jaxws="http://cxf.apache.org/jaxws" 
xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <import resource="classpath:application_context/ApplicationContext*.xml" /> 
    <context:annotation-config /> 
    <!--========== Spring Data Source ========== --> 
    <!--Bean stuff--> 

基本上我想只有一個存儲在src/main/resources ApplicationContext的文件中的每一個副本,讓Maven的複製他們的測試和exec範圍。但是我的測試類無法找到並加載它們。我必須做什麼?

+2

你爲什麼要從'appcontext'複製到'application_context'?這隻會混淆問題。爲什麼不使用默認值,在這種情況下,'src/main/resources/appcontext'會在'WEB-INF/classes/appcontext'中結束?在你的SCM上它也會更容易,因爲你在構建時不會因'src'的變化而結束。 – artbristol

+0

好點@artbristol。 –

回答

2

假設您的applicationContext.xml位於src/main/resources/appcontext,Maven將默認將其置於WEB-INF/classes/appcontext中。沒有必要爲該資源分配新路徑。

你應該能夠找到上下文文件在您的測試用:

@ContextConfiguration(locations={"/appcontext/applicationContext.xml"}) 

你不應該需要這個額外的Maven的設置。

+0

我把它們存儲在'/ src/main/resources/appcontext'中,但是如果我嘗試這種方式,我得到了這個錯誤:org.springframework.beans.factory.BeanDefinitionStoreException:IOException從類路徑資源解析XML文檔[appcontext/applicationContext.xml中];嵌套異常是java.io.FileNotFoundException:類路徑資源[appcontext/applicationContext.xml]無法打開,因爲它不存在' –

+1

但是您的Maven插件不能將它們複製到這裏:/ classes/application_context。檢查它們在構建目錄中的位置。當你使用'@ContextConfiguration(locations = {「/ application_context/applicationContext.xml})時會發生什麼' – cowls

+0

是的,它在那裏複製它們。在測試執行之前,我有這個日誌。 '[INFO]使用'ISO-8859-1'編碼來複制過濾的資源。 [INFO]將3個資源複製到C:\ Users \ amaeztu \ workspace \ System_Maven/src/main/webapp/WEB-INF/classes/application_context中,但後來當執行測試時,我得到一個java.io.FileNotFoundException '這個目錄也是錯誤的。 –

相關問題