Рубрики
Без рубрики

WebAppСоверждение в весенних тестах

Быстрое и практическое руководство по использованию @WebAppConfiguration аннотации в весенних тестах

Автор оригинала: baeldung.

WebAppСоверждение в весенних тестах

1. Обзор

В этой статье мы изумим @WebAppConfiguration аннотация весной, почему мы нуждаемся в нем в наших интеграционных тестов, а также как мы можем настроить его так, что эти тесты на самом деле bootstrap WebApplicationКонтекст .

2. @WebAppConfiguration

Проще говоря, это аннотация классового уровня, используемая для создания веб-версии контекста приложения в Весенней рамочной программе.

Он используется для обозначения того, что ПриложениеКонтекст который bootstrapped для теста должно быть примером WebApplicationКонтекст .

Краткое примечание об использовании – мы обычно находим эту аннотацию в интеграционных тестах, потому что WebApplicationКонтекст используется для создания МокМвк объект. Вы можете найти более подробную информацию об интеграционном тестировании с помощью Spring здесь .

3. Загрузка WebApplicationContext

Начиная с весны 3.2, теперь есть поддержка для загрузки WebApplicationКонтекст в интеграционных тестах :

@WebAppConfiguration
@ContextConfiguration(classes = WebConfig.class)
public class EmployeeControllerTest {
    ...
}

Это инструктирует ТестКонтекст рамки, которые WebApplicationКонтекст должны быть загружены для теста.

И, на заднем плане MockServletКонтекст создается и поставляется в систему нашего WebApplicationКонтекст по ТестКонтекст каркас.

3.1. Параметры конфигурации

По умолчанию путь базового ресурса для WebApplicationКонтекст будет установлен на “файл:src/main/webapp”, которое является расположением по умолчанию для корня войны в maven Project.

Тем не менее, мы можем переопределить это, просто предоставляя альтернативный путь к @WebAppConfiguration аннотация:

@WebAppConfiguration("src/test/webapp")

Мы также можем ссылаться на базовый путь ресурса из classpath вместо файловой системы:

@WebAppConfiguration("classpath:test-web-resources")

3.2. Кэшинг

После WebApplicationКонтекст загружается, он будет кэширован и повторно использован для всех последующих тестов, которые объявляют ту же уникальную конфигурацию контекста в одном и том же тестовом наборе.

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

4. Использование @WebAppConfiguration в тестах

Теперь, когда мы понимаем, почему мы должны добавить @WebAppConfiguration аннотация в наших тестовых классах, давайте посмотрим что произойдет, если мы пропустим добавить его когда мы используем WebApplicationКонтекст .

@RunWith(SpringJUnit4ClassRunner.class)
// @WebAppConfiguration omitted on purpose
@ContextConfiguration(classes = WebConfig.class)
public class EmployeeTest {

    @Autowired
    private WebApplicationContext webAppContext;
    private MockMvc mockMvc;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build();
    }
    
    ...
}

Обратите внимание, что мы прокомментировали аннотацию, чтобы имитировать сценарий, в котором мы забываем добавить его. Здесь легко понять, почему тест не удастся, когда мы запускаем тест JUnit: мы пытаемся автопроводить WebApplicationКонтекст в классе, где мы не установили один .

Однако более типичным примером является тест, в который используется конфигурация Весна с поддержкой Интернета; это на самом деле достаточно, чтобы сделать тест-брейк.

Давайте посмотрим:

@RunWith(SpringJUnit4ClassRunner.class)
// @WebAppConfiguration omitted on purpose
@ContextConfiguration(classes = WebConfig.class)
public class EmployeeTestWithoutMockMvc {

    @Autowired
    private EmployeeController employeeController;

    ...
}

Несмотря на то, что приведенный выше пример не является автоматической проводкой WebApplicationКонтекст он по-прежнему потерпит неудачу, потому что он пытается использовать конфигурацию с поддержкой Интернета – WebConfig :

@Configuration
@EnableWebMvc
@ComponentScan("com.baeldung.web")
public class WebConfig implements WebMvcConfigurer {
    ...
}

Аннотация @EnableWebMvc является виновником здесь – что в основном требует веб включен Весенний контекст, и без него – мы увидим, тест неудачу:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
  No qualifying bean of type [javax.servlet.ServletContext] found for dependency: 
    expected at least 1 bean which qualifies as autowire candidate for this dependency. 

Dependency annotations: 
  {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at o.s.b.f.s.DefaultListableBeanFactory
      .raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373)
    at o.s.b.f.s.DefaultListableBeanFactory
      .doResolveDependency(DefaultListableBeanFactory.java:1119)
    at o.s.b.f.s.DefaultListableBeanFactory
      .resolveDependency(DefaultListableBeanFactory.java:1014)
    at o.s.b.f.a.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement
      .inject(AutowiredAnnotationBeanPostProcessor.java:545)
    ... 43 more

Так вот в чем проблема, которую мы легко исправить, добавив @WebAppConfiguration аннотация к нашим тестам.

5. Заключение

В этой статье мы показали, как мы можем позволить ТестКонтекст для загрузки WebApplicationКонтекст в наши интеграционные тесты, просто добавив аннотацию.

Наконец, мы рассмотрели примеры, которые, хотя, если мы добавим КонтекстКонфигурация к тесту, это не сможет работать, если мы не добавим @WebAppConfiguration аннотация.

Реализация примеров в этой статье доступна в нашем репозитории на GitHub .