2013-04-11 78 views
6

我們在服務層&視圖層上下文配置之間有一個明確的抽象,我們正在加載它們,如下所示。如何在Spring MVC測試中設置Web應用程序上下文

Root application context: 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value> 
</context-param> 

Web application context: 

<servlet> 
    <servlet-name>lovemytasks</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/mmapp-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

現在我們試圖介紹SPRING MVC TEST FRAMEWORK來測試我們的應用程序。

爲此我需要設置與我的真實Web應用程序相同的環境。

我該怎麼做?

我在我的測試配置下面嘗試加載兩個上下文。

@ContextConfiguration(locations = { "classpath*:META-INF/spring/applicationContext*.xml", 
    "file:src/main/webapp/WEB-INF/spring/mmapp-servlet.xml" }) 

但它的示數出來說

Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Duplicate <global-method-security> detected. 

我們定義這兩個根應用上下文和Web應用程序上下文全球安全。

注意:當我運行我的web應用程序時,上述問題不會出現。它發生只有當我運行Spring MVC測試

我試圖刪除我的全球安全和一個地方,然後登陸到運行我的測試轉換服務的錯誤。其中有人警告說,我並不像真正的Spring應用程序那樣加載上下文。

現在,我想設置我的Spring MVC測試環境,以便像我的春季Web應用程序環境一樣使用或工作。任何人都可以請建議我如何實現它?

回答

7

使用@ContextHierarchy註釋。它的javadoc很好地描述了它。在你的情況下,你會使用

@WebAppConfiguration 
@ContextHierarchy({ 
    @ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext-*.xml" }), 
    @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/mmapp-servlet.xml" }) 
}) 
1

不要把你的appContext放在meta-inf中。

「正常」 的辦法是有一個彈簧servlet.xml中在您的WEB-INF

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>WEB-INF/spring-servlet.xml</param-value> 
    </context-param> 

和N然後在XML文件中導入不同的文件:

<import resource="classpath:beans.xml"/> 

我創建了一個爲我的測試分開appContent:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations ="classpath:applicationContext-test.xml") 
@Transactional 
public class MyTest { 

您的bean必須在沿線的某處加載兩次,你是否導入了兩次這些bean,在xml中定義它們,並且還註釋了它們?

+0

我不想合併兩個上下文文件或將它包含在Web應用程序上下文中,因爲很少有架構問題。此外,我想要在我的測試中運行我的應用程序時發生的相同的應用程序上下文設置。 – Shiv 2013-04-11 22:20:03

相關問題