Как настроить контекст веб-приложения в тесте Spring MVC

у нас есть четкая абстракция между слоями сервиса и конфигурациями контекста слоев представления, и мы загружаем их, как показано ниже.

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 для тестирования нашего приложения.

для этого мне нужно будет настроить ту же среду, что и мое реальное веб-приложение.

как я могу это сделать ?

Я попытался ниже конфигурации на моем тесте загрузить оба контекста.

@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. 

мы определили глобальную безопасность как в контексте корневого приложения, так и в контексте веб-приложения.

Примечание: вышеупомянутая проблема не появится при запуске моего веб-приложения. Это происходит только при запуске Spring MVC test

Я попытался удалить мою глобальную безопасность и одно место, а затем посадку в ошибки со службами преобразования при запуске моих тестов. Что предупредило меня, что я ... не загружая контекст, как это делает приложение real Spring.

Теперь я хотел бы настроить тестовую среду Spring MVC для использования или работы так же, как работает моя среда веб-приложений spring. Может ли кто-нибудь предложить, как я могу этого достичь ?

2 ответов


использовать @ContextHierarchy Примечание. Его javadoc хорошо описывает его. В вашем случае вы должны использовать

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

не помещайте свой appContext в meta-inf.

"нормальный" способ-иметь один пружинный сервлет.xml в вашем web-inf

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

Andn затем импортировать различные файлы в xml-файл:

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

Я создаю отдельный appContent для моих тестов:

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

ваши бобы должны загружаться дважды где-то по линии, вы импортируете бобы дважды, определяя их как в xml, так и аннотируя ?