WebAppConfiguration u proljetnim testovima

1. Pregled

U ovom ćemo članku istražiti @WebAppConfiguration napomena u proljeće, zašto nam je potrebna u našim integracijskim testovima, a također kako je možemo konfigurirati tako da se ovi testovi zapravo pokrenu WebApplicationContext.

2. @WebAppConfiguration

Jednostavno rečeno, ovo je napomena na razini klase koja se koristi za stvaranje web verzije konteksta aplikacije u Spring Framework-u.

Koristi se za označavanje da ApplicationContext koji je bootstrapped za test trebao biti instanca WebApplicationContext.

Kratka napomena o upotrebi - ovu ćemo napomenu obično pronaći u integracijskim testovima jer WebApplicationContext koristi se za izgradnju a MockMvc objekt. Više informacija o integracijskom testiranju s Springom možete pronaći ovdje.

3. Učitavanje a WebApplicationContext

Počevši od proljeća 3.2, sada postoji podrška za učitavanje a WebApplicationContext u integracijskim testovima:

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

Ovo upućuje TestContext okvir koji a WebApplicationContext treba učitati za test.

I, u pozadini a MockServletContext kreira se i isporučuje našim testovima WebApplicationContext od strane TestContext okvir.

3.1. Opcije konfiguracije

Prema zadanim postavkama, osnovni put resursa za WebApplicationContext bit će postavljeno na “Datoteka: src / main / webapp”, što je zadano mjesto za korijen WAR-a u projektu Maven.

Međutim, to možemo nadvladati jednostavnim pružanjem alternativnog puta do @WebAppConfiguration napomena:

@WebAppConfiguration ("src / test / webapp")

Također se možemo uputiti na osnovnu stazu resursa iz staze klasa umjesto datotečnog sustava:

@WebAppConfiguration ("put puta: test-web-resursi")

3.2. Predmemoriranje

Jednom WebApplicationContext učitava se u predmemoriju i ponovno koristi za sve naredne testove koji deklariraju istu jedinstvenu konfiguraciju konteksta unutar istog paketa testova.

Za daljnje pojedinosti o predmemoriranju možete pogledati odjeljak Kontekst predmemoriranja u referentnom priručniku.

4. Korištenje @WebAppConfiguration u testovima

Sad kad razumijemo zašto trebamo dodati @WebAppConfiguration napomena u našim testnim tečajevima, da vidimo što se događa ako ga propustimo dodati kada koristimo a WebApplicationContext.

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration namjerno izostavljen @ContextConfiguration (classes = WebConfig.class) javna klasa EmployeeTest {@Autowired private WebApplicationContext webAppContext; privatni MockMvc mockMvc; @ Prije javne void postavke () {MockitoAnnotations.initMocks (ovo); mockMvc = MockMvcBuilders.webAppContextSetup (webAppContext) .build (); } ...}

Primijetite da smo komentar komentirali kako bismo simulirali scenarij u kojem smo ga zaboravili dodati. Ovdje je lako shvatiti zašto test neće uspjeti kada pokrenemo JUnit test: pokušavamo automatski povezati WebApplicationContext u razredu gdje ga nismo postavili.

Tipičniji je primjer test koji koristi mrežnu konfiguraciju Spring; to je zapravo dovoljno za test pauzu.

Pogledajmo:

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration namjerno izostavljeno @ContextConfiguration (classes = WebConfig.class) javna klasa EmployeeTestWithoutMockMvc {@Autowired private EmployeeController workerController; ...}

Iako gornji primjer nije automatsko povezivanje a WebApplicationContext i dalje neće uspjeti jer pokušava koristiti konfiguraciju s omogućenom mrežom - WebConfig:

@Configuration @EnableWebMvc @ComponentScan ("com.baeldung.web") javna klasa WebConfig implementira WebMvcConfigurer {...}

Bilješka @EnableWebMvc je ovdje krivac - za koji će u osnovi biti potreban internetski kontekst Spring Spring, a bez njega ćemo vidjeti kako test nije uspio:

Uzročnik: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nije pronađen nijedan kvalificirani grah tipa [javax.servlet.ServletContext] za ovisnost: očekuje se najmanje 1 grah koji se kvalificira kao kandidat automatske žice za ovu ovisnost. Anotacije ovisnosti: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} na osbfsDefaultListableBeanFactory .raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1373) at osbfsDefaultesistaBeandBeandBeandeLabDefaultLaveBandBeandeLabDefault resolDependency (DefaultListableBeanFactory.java:1014) na osbfaAutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement .inject (AutowiredAnnotationBeanPostProcessor.java:545) ... još 43

Dakle, to je problem koji lako rješavamo dodavanjem @WebAppConfiguration napomena za naše testove.

5. Zaključak

U ovom smo članku pokazali kako možemo dopustiti TestContext okvir za učitavanje a WebApplicationContext u naše integracijske testove samo dodavanjem napomene.

Napokon, pogledali smo primjere koji, iako ako dodamo znak @ContextConfiguration na test, ovo neće moći raditi ako ne dodamo @WebAppConfiguration bilješka.

Primjena primjera u ovom članku dostupna je u našem spremištu na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found