WebAppConfiguration у весняних тестах

1. Огляд

У цій статті ми дослідимо анотацію @WebAppConfiguration навесні, навіщо вона нам потрібна в наших тестах інтеграції, а також як ми можемо її налаштувати так, щоб ці тести насправді завантажували WebApplicationContext .

2. @WebAppConfiguration

Простіше кажучи, це анотація класу, яка використовується для створення веб-версії контексту програми у Spring Framework.

Він використовується для позначення того, що ApplicationContext, який завантажується для тесту, повинен бути екземпляром WebApplicationContext .

Коротка примітка про використання - ми зазвичай знаходимо цю анотацію в тестах інтеграції, оскільки WebApplicationContext використовується для побудови об'єкта MockMvc . Більше інформації про інтеграційне тестування з Spring можна знайти тут.

3. Завантаження WebApplicationContext

Починаючи з версії 3.2, тепер у тестах інтеграції підтримується завантаження WebApplicationContext :

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

Це вказує фреймворку TestContext, що для тесту слід завантажити WebApplicationContext .

А у фоновому режимі створюється MockServletContext і надсилається до тесту WebApplicationContext за допомогою рамки TestContext .

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

За замовчуванням для базового шляху ресурсу для WebApplicationContext буде встановлено значення “file: src / main / webapp”, що є місцем за замовчуванням для кореня WAR у проекті Maven.

Однак ми можемо це перевизначити, просто надавши альтернативний шлях до анотації @WebAppConfiguration :

@WebAppConfiguration("src/test/webapp")

Ми також можемо посилатися на базовий шлях до ресурсу із шляху до класу замість файлової системи:

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

3.2. Кешування

Після завантаження WebApplicationContext він буде кешований та повторно використаний для всіх наступних тестів, які оголошують одну і ту ж унікальну конфігурацію контексту в тому ж наборі тестів.

Для отримання додаткової інформації про кешування ви можете ознайомитися з розділом кешування контексту в довідковому посібнику.

4. Використання @WebAppConfiguration у тестах

Тепер, коли ми зрозуміли, чому нам потрібно додати анотацію @WebAppConfiguration у наші тестові класи, давайте подивимося, що трапиться, якщо ми пропустимо її додати, коли ми використовуємо WebApplicationContext .

@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: ми намагаємося автоматично підключити WebApplicationContext до класу, де ми його не встановили .

Однак більш типовим прикладом є тест, який використовує веб-конфігурацію Spring; цього насправді достатньо, щоб зробити пробну перерву.

Давай подивимось:

@RunWith(SpringJUnit4ClassRunner.class) // @WebAppConfiguration omitted on purpose @ContextConfiguration(classes = WebConfig.class) public class EmployeeTestWithoutMockMvc { @Autowired private EmployeeController employeeController; ... }

Незважаючи на те, що наведений вище приклад не є автоматичним підключенням WebApplicationContext, він все одно не вдасться, оскільки намагається використовувати конфігурацію з підтримкою Інтернету - WebConfig :

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

Винуватцем тут є анотація @EnableWebMvc - яка в основному потребуватиме веб-контексту Spring, а без цього - ми побачимо невдалий тест:

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. Висновок

У цій статті ми показали, як ми можемо дозволити фреймворку TestContext завантажувати WebApplicationContext в наші тести інтеграції, просто додавши анотацію.

Нарешті, ми розглянули приклади, що навіть якщо ми додамо до тесту @ ContextConfiguration , це не зможе працювати, якщо ми не додамо анотацію @WebAppConfiguration .

Реалізація прикладів у цій статті доступна у нашому сховищі на GitHub.