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.