WebAppConfiguration при пролетни тестове

1. Общ преглед

В тази статия ще изследваме анотацията @WebAppConfiguration през пролетта, защо ни е необходима в нашите тестове за интеграция, както и как можем да я конфигурираме така, че тези тестове всъщност да стартират WebApplicationContext .

2. @WebAppConfiguration

Просто казано, това е анотация на ниво клас, използвана за създаване на уеб версия на контекста на приложението в Spring Framework.

Използва се за означаване, че ApplicationContext, който се зарежда за теста, трябва да бъде екземпляр на WebApplicationContext .

Бърза бележка за използването - обикновено ще открием тази анотация в тестовете за интеграция, защото WebApplicationContext се използва за изграждане на обект MockMvc . Можете да намерите повече информация за тестването на интеграция с Spring тук.

3. Зареждане на WebApplicationContext

Започвайки с Spring 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 Project.

Въпреки това можем да заменим това, като просто предоставим алтернативен път до анотацията @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 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.