2012-05-04 1 views
8

Я пытаюсь написать интеграционные тесты для контроллера в нашем весеннем приложении mvc. Контроллер вызывает класс службы, который, в свою очередь, вызывает дао для чтения/записи данных из репозитория. DAO необходимо найти некоторую конфигурацию. Конфигурационный компонент определен в WEB-INF/applicationContext.xml.Напишите тесты Junit для приложения Spring MVC, которое внутренне полагается на ContextLoader.getCurrentWebApplicationContext()

Я использую что-то вроде этого:.

Конфигурация конфигурации = (Конфигурация) ContextLoader.getCurrentWebApplicationContext() getBean ("конфигурации");
private String namespace = config.getProperty ("someproperty");

Свойства хранятся в zookeeper, поэтому я не использую артефакты управления свойствами весны.

Проблема заключается в том, что при запуске теста JUnit ContextLoader.getCurrentWebApplicationContext() всегда возвращает null.

Я до сих пор смотрела на следующие подходы:
1. Подход Теда Янга (только поиск Google для Spring MVC интеграции тестов Ted молодых)
2. https://github.com/SpringSource/spring-test-mvc
3. этот сайт .. вопросы/8464919/блок-тестирование-а-сервлет-что-зависит-на-пружинах-webapplicationcontextutils-getre
4. Использование Selenium/JWebunit
5. http://confluence.highsource.org/display/Hifaces20/Hifaces20+Testing+package+-+testing%2C+tracing+and+debugging+web+applications+with+Jetty

1 не решает эту проблему. WebApplicationContext остается нулевым
2 утверждает, что поддержка WebApplicationContext будет доступна весной 3.2
3. Я не понимаю этого. Где я могу получить testApplicationContext и getServletContext()?
4. Я не хочу идти этим путем, так как это полностью проверка Blackbox.
5. В настоящее время я смотрю на 5. Но для этого требуется запуск контейнера сервлетов. Нет ли другой альтернативы?

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

Благодаря PixalSoft

@Ted Молодые SO не позволили мне закончить то, что я был saying.With погрузчик = MockWebApplicationContextLoader, это не должно быть доступно в ContextLoader по умолчанию точно так, как ведет себя Spring ContextLoader когда webapp инициализируется сервером-сервлетом? Есть ли что-то особенное, что мне нужно сделать, чтобы получить дескриптор в MockWebApplicationContextLoader? Инъекция объекта config работает для одноэлементных объектов. Но все не может быть одноточечным. Передача объекта конфигурации в каждом конструкторе звучит слишком утомительно. На данный момент я создал класс, у которого есть статический объект конфигурации, который автоматически передается через метод setter. Я рассмотрю ApplicationContextAware.Many thx

ответ

0

Сохраните ваш файл свойств в вашем пути к классам.

теперь получить доступ к этому свойству в классе контроллера, как это:

/*to access your filename.properties file */ 
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties")); 

String sServerLocation = properties.getProperty("key"); 

теперь вы можете получить доступ к файл свойств.

Уверен, что он сработает.

+0

Привет, Спасибо, что ответили. Мы не можем хранить свойства в файле свойств, потому что мы находимся в распределенной среде, и по этой причине нам нужно хранить свойства в zookeeper. Кроме того, я не думаю, что использование ContextLoader.getCurrentWebApplicationContext() должно помешать тестированию приложения. – user1373927

1

Причина, по которой ContextLoader.getCurrentWebApplicationContext возвращает значение null, заключается в том, что при использовании моего MockWebApplicationContextLoader вы не используете ни контекст веб-приложения, ни конкретную реализацию ContextLoader.

Поскольку ваш репозиторий управляется Spring, почему бы вам просто не добавить объект конфигурации в репозиторий? Включение объекта конфигурации является наиболее подходящим способом доступа к нему. Затем вы можете инициализировать свое свойство namespace в методе, аннотированном с @PostConstruct.

В качестве альтернативы, ваша DOA может реализовать ApplicationContextAware для получения копии контекста приложения во время построения.

+0

Привет, Если я использую loader = MockWebApplicationContextLoader, разве он не должен быть доступен как загрузчик контекста по умолчанию, точно так же, как Spring Context Loader ведет себя, когда веб-приложение инициализируется контейнером сервлета? Есть ли что-то особенное, что мне нужно сделать, чтобы получить ручку на MockWebApplicationContextLoader? OTOH, если он не ведет себя так, зачем мне это нужно? – user1373927

+2

Нет, это не ** предполагается ** быть доступным. Вам нужно будет расширить MWACL для настройки ContextLoader, и я не вижу никакого простого способа сделать это. Использование ContextLoader - плохая идея по этой причине. Вы действительно должны спросить себя, почему вы используете ContextLoader, чтобы получить доступ к ApplicationContext в первую очередь. –

+0

Мы используем ContextLoader, потому что просто невозможно вставлять весенние бобы везде, где они нужны. AFAIK ContextLoader.getCWAC() является допустимым использованием API. Спасибо. – user1373927

3

Добавьте следующий код в начале вашего JUnit тест:

MockServletContext sc = new MockServletContext(""); 
sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, 
     "/applicationContext-test.xml"); // <== Customize with your paths 
ServletContextListener listener = new ContextLoaderListener(); 
ServletContextEvent event = new ServletContextEvent(sc); 
listener.contextInitialized(event); 

Если вам нужно добавить несколько XML для контекстного пути просто положить их в той же строке, разделенных пробелами, например:

sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, 
     "/applicationContext-test.xml /applicationContext-other.xml"); 
+0

очень хорошее решение, просто добавив документы для более подробной информации. Https://docs.spring.io/spring/docs/2.5.x/javadoc-api/org/springframework/mock/web/MockServletContext.html – VedX

3

Вы должны вручную добавить контекст WebApplication в ContextLoderListner. Это будет работать.

@ContextConfiguration(locations = "classpath:module-test-beans.xml") 
@WebAppConfiguration 
public class SampleTest extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private WebApplicationContext wac; 

    @BeforeClass 
    public void setUp() throws ServletException { 
     MockServletContext sc = new MockServletContext(""); 
     ServletContextListener listener = new ContextLoaderListener(wac); 
     ServletContextEvent event = new ServletContextEvent(sc); 
     listener.contextInitialized(event); 
    } 

    @Test 
    public void testMe() { 
     Assert.assertFalse(ContextLoader.getCurrentWebApplicationContext() == null); 
    } 
} 
Смежные вопросы