WebAppConfiguration a tavaszi tesztekben

1. Áttekintés

Ebben a cikkben a @WebAppConfiguration tavaszi kommentár, miért van szükségünk rá integrációs tesztjeink során, és hogyan konfigurálhatjuk úgy, hogy ezek a tesztek valóban WebApplicationContext.

2. @WebAppConfiguration

Egyszerűen fogalmazva, ez egy osztályszintű feljegyzés, amelyet az alkalmazási környezet webes verziójának létrehozásához használnak a Spring Framework-ben.

Arra használják, hogy jelezzék ApplicationContext amely a teszt számára bootstrapped, annak egy példányának kell lennie WebApplicationContext.

Rövid megjegyzés a használatról - ezt a kommentárt általában az integrációs tesztekben találjuk meg, mert a WebApplicationContext építésére használják a MockMvc tárgy. További információt a Spring integrációs teszteléséről itt talál.

3. Betöltés a WebApplicationContext

A 3.2 tavasztól kezdve támogatást kap a WebApplicationContext integrációs tesztekben:

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

Ez utasítja a TestContext keretrendszer, amely a WebApplicationContext terhelni kell a teszthez.

És a háttérben a MockServletContext létrejön és a tesztjeinkhez eljuttatjuk WebApplicationContext valami által TestContext keretrendszer.

3.1. Konfigurációs beállítások

Alapértelmezés szerint a WebApplicationContext értékre lesz állítva „File: src / main / webapp”, amely a WAR gyökérzetének alapértelmezett helye egy Maven Projektben.

Ezt azonban felülírhatjuk azzal, hogy egyszerűen alternatív utat adunk a @WebAppConfiguration kommentár:

@WebAppConfiguration ("src / test / webapp")

A fájlrendszer helyett hivatkozhatunk egy alap erőforrás elérési útjára is az osztályútvonalról:

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

3.2. Gyorsítótár

Egyszer a WebApplicationContext betöltődik, a rendszer gyorsítótárba kerül, és újból felhasználja az összes következő tesztet, amely ugyanazon egyedi környezetkonfigurációt deklarálja ugyanazon tesztcsomagon belül.

A gyorsítótárral kapcsolatos további részletekért tekintse meg a referencia kézikönyv Kontextus gyorsítótárazás szakaszát.

4. Használata @WebAppConfiguration a tesztekben

Most, hogy megértettük, miért kell hozzáadnunk a @WebAppConfiguration jelölés tesztosztályainkon, nézzük meg mi történik, ha elmulasztjuk hozzáadni amikor a WebApplicationContext.

@RunWith (SpringJUnit4ClassRunner.class) // @ @WebAppConfiguration szándékosan kihagyva @ContextConfiguration (class = WebConfig.class) public class EmployeeTest {@Autowired private WebApplicationContext webAppContext; privát MockMvc mockMvc; @A nyilvános void beállítása előtt () {MockitoAnnotations.initMocks (this); mockMvc = MockMvcBuilders.webAppContextSetup (webAppContext) .build (); } ...}

Figyeljük meg, hogy kommentáltuk az annotációt, hogy szimuláljuk azt a forgatókönyvet, amelyben elfelejtjük hozzáadni. Itt könnyen belátható, hogy miért nem sikerül a teszt a JUnit teszt futtatásakor: megpróbáljuk automatikusan bekötni a WebApplicationContext egy osztályban, ahol még nem állítottunk be egyet.

Tipikusabb példa azonban egy teszt, amely webalapú Spring konfigurációt használ; ez valójában elég a teszt szünetéhez.

Nézzük meg:

@RunWith (SpringJUnit4ClassRunner.class) // @ @WebAppConfiguration szándékosan kihagyva @ContextConfiguration (class = WebConfig.class) public class EmployeeTestWithoutMockMvc {@Autowired private EmployeeController workerController; ...}

Annak ellenére, hogy a fenti példa nem automatikus a WebApplicationContext még mindig kudarcot vall, mert megpróbál webes konfigurációt használni - WebConfig:

@Configuration @EnableWebMvc @ComponentScan ("com.baeldung.web") nyilvános osztály WebConfig valósítja meg a WebMvcConfigurer {...}

Az annotáció @EnableWebMvc itt a tettes - amihez alapvetően egy webalapú tavaszi kontextusra lesz szükség, enélkül pedig a teszt kudarcát látjuk:

Okozta: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nem található [javax.servlet.ServletContext] típusú minősítő bab a függőséghez: várhatóan legalább 1 bab, amely jogosultnak minősül ennek a függőségnek. Függőségi megjegyzések: {@ org.springframework.beans.factory.annotation.Autowired (kötelező = igaz)} itt: osbfsDefaultListableBeanFactory .raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1373) at osbfsDefault. resolDependency (DefaultListableBeanFactory.java:1014) at osbfaAutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement .inject (AutowiredAnnotationBeanPostProcessor.java:545) ... 43 tovább

Tehát ez a probléma, amelyet könnyen megoldunk a @WebAppConfiguration tesztjeink jegyzete.

5. Következtetés

Ebben a cikkben megmutattuk, hogyan engedhetjük meg a TestContext keretet betölteni a WebApplicationContext integrációs tesztjeinkbe, csak az annotáció hozzáadásával.

Végül megvizsgáltuk azokat a példákat, amelyek ellenére, ha hozzáadjuk aContextConfiguration a teszthez ez csak akkor működhet, ha hozzáadjuk a @WebAppConfiguration annotáció.

Az ebben a cikkben szereplő példák megvalósítása elérhető a GitHub tárházunkban.