WebAppConfiguration v jarných testoch

1. Prehľad

V tomto článku preskúmame @WebAppConfiguration anotáciu na jar, prečo to potrebujeme v našich integračných testoch a tiež ako ich môžeme nakonfigurovať tak, aby tieto testy skutočne bootstrap WebApplicationContext.

2. @WebAppConfiguration

Jednoducho povedané, toto je anotácia na úrovni triedy, ktorá sa používa na vytvorenie webovej verzie kontextu aplikácie v jarnom rámci.

Používa sa na označenie toho, že ApplicationContext ktorý je bootstrapovaný pre test by mal byť inštanciou WebApplicationContext.

Krátka poznámka k použitiu - túto anotáciu zvyčajne nájdeme v integračných testoch, pretože WebApplicationContext sa používa na stavbu a MockMvc objekt. Viac informácií o testovaní integrácie s programom Spring nájdete tu.

3. Načítanie a WebApplicationContext

Od jari 3.2 je teraz podpora načítania a WebApplicationContext v integračných testoch:

@WebAppConfiguration @ContextConfiguration (triedy = WebConfig.class) verejná trieda EmployeeControllerTest {...} 

To dáva pokyn TestContext rámec, ktorý a WebApplicationContext by mali byť načítané pre test.

A v pozadí a MockServletContext je vytvorený a dodávaný do našich testov WebApplicationContext podľa TestContext rámec.

3.1. Možnosti konfigurácie

V predvolenom nastavení je cesta základného prostriedku pre server WebApplicationContext bude nastavený na “File: src / main / webapp”, čo je predvolené umiestnenie pre koreň VOJNY v projekte Maven.

Môžeme to však prekonať jednoduchým poskytnutím alternatívnej cesty k @WebAppConfiguration anotácia:

@WebAppConfiguration ("src / test / webapp")

Môžeme tiež odkazovať na cestu základného prostriedku z cesty triedy namiesto systému súborov:

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

3.2. Ukladanie do vyrovnávacej pamäte

Raz WebApplicationContext je načítaný, bude uložený do medzipamäte a znovu použitý pre všetky nasledujúce testy, ktoré deklarujú rovnakú jedinečnú konfiguráciu kontextu v rámci tej istej testovacej sady.

Ďalšie informácie o ukladaní do vyrovnávacej pamäte nájdete v príručke v časti Kontextové ukladanie do medzipamäte.

4. Používanie @WebAppConfiguration v testoch

Teraz, keď už chápeme, prečo musíme pridať @WebAppConfiguration anotáciu v našich testovacích triedach, pozrime sa čo sa stane, ak to zmeškáme? keď používame a WebApplicationContext.

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration vynechaný zámerne @ContextConfiguration (classes = WebConfig.class) verejná trieda EmployeeTest {@Autowired private WebApplicationContext webAppContext; súkromné ​​MockMvc mockMvc; @ Pred public void setup () {MockitoAnnotations.initMocks (this); mockMvc = MockMvcBuilders.webAppContextSetup (webAppContext) .build (); } ...}

Všimnite si, že sme anotáciu komentovali, aby sme simulovali scenár, do ktorého ju zabudneme pridať. Tu je ľahké pochopiť, prečo test zlyhá, keď spustíme test JUnit: snažíme sa autowire WebApplicationContext v triede, kde sme žiaden nenastavili.

Typickejším príkladom je však test, ktorý používa webovú konfiguráciu Spring; to je vlastne dosť na to, aby sa test prerušil.

Pozrime sa na to:

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration vynechaný zámerne @ContextConfiguration (classes = WebConfig.class) verejná trieda EmployeeTestWithoutMockMvc {@Autowired private EmployeeController employeeController; ...}

Aj keď vyššie uvedený príklad nie je autowiring a WebApplicationContext stále zlyhá, pretože sa pokúša použiť webovú konfiguráciu - WebConfig:

@Configuration @EnableWebMvc @ComponentScan ("com.baeldung.web") verejná trieda WebConfig implementuje WebMvcConfigurer {...}

Anotácia @EnableWebMvc je tu vinník - ktorý bude v zásade vyžadovať webový jarný kontext a bez neho - uvidíme, že test zlyhá:

Spôsobené: org.springframework.beans.factory.NoSuchBeanDefinitionException: Pre závislosť sa nenašiel žiadny kvalifikovaný fazuľa typu [javax.servlet.ServletContext]: očakáva sa minimálne 1 fazuľa, ktorá sa kvalifikuje ako kandidát autowire pre túto závislosť. Poznámky k závislosti: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} na osbfsDefaultListableBeanFactory .raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1373) na osbfsDefaultListableBeanFactory. resolveDependency (DefaultListableBeanFactory.java:1014) at osbfaAutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement .inject (AutowiredAnnotationBeanPostProcessor.java:545) ... 43 ďalších

Takže to je problém, ktorý ľahko opravíme pridaním @WebAppConfiguration anotácia k našim testom.

5. Záver

V tomto článku sme si ukázali, ako môžeme nechať TestContext rámec na načítanie a WebApplicationContext do našich integračných testov iba pridaním anotácie.

Nakoniec sme sa pozreli na príklady, že aj keď pridáme znak @ContextConfiguration k testu to nebude môcť fungovať, pokiaľ nepridáme @WebAppConfiguration anotácia.

Implementácia príkladov v tomto článku je k dispozícii v našom úložisku na GitHub.