WebAppConfiguration i vårtester

1. Oversikt

I denne artikkelen vil vi utforske @WebAppConfiguration kommentar om våren, hvorfor vi trenger det i integrasjonstestene våre, og hvordan kan vi konfigurere det slik at disse testene faktisk starter en WebApplicationContext.

2. @WebAppConfiguration

Enkelt sagt, dette er en merknad på klassenivå som brukes til å lage en webversjon av applikasjonskonteksten i Spring Framework.

Det brukes til å betegne at ApplicationContext som er bootstrapped for testen, bør være en forekomst av WebApplicationContext.

Et raskt notat om bruk - vi finner vanligvis denne merknaden i integrasjonstester fordi WebApplicationContext brukes til å bygge en MockMvc gjenstand. Du kan finne mer informasjon om integrasjonstesting med Spring her.

3. Lasting a WebApplicationContext

Fra og med våren 3.2 er det nå støtte for lasting av en WebApplicationContext i integrasjonstester:

@WebAppConfiguration @ContextConfiguration (klasser = WebConfig.class) offentlig klasse EmployeeControllerTest {...} 

Dette instruerer TestContext rammeverk som en WebApplicationContext skal lastes for testen.

Og i bakgrunnen a MockServletContext blir opprettet og levert til testene våre WebApplicationContext ved TestContext rammeverk.

3.1. Konfigurasjonsalternativer

Som standard er grunnressursstien for WebApplicationContext vil bli satt til “Fil: src / main / webapp”, som er standardplasseringen for WAR-roten i et Maven-prosjekt.

Vi kan imidlertid overstyre dette ved ganske enkelt å gi en alternativ vei til @WebAppConfiguration kommentar:

@WebAppConfiguration ("src / test / webapp")

Vi kan også referere til en grunnressursti fra klassestien i stedet for filsystemet:

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

3.2. Caching

Først når WebApplicationContext er lastet vil den bli bufret og gjenbrukt for alle påfølgende tester som erklærer den samme unike kontekstkonfigurasjonen i samme testpakke.

For ytterligere detaljer om hurtigbufring, kan du se avsnittet Kontekstbufring i referansehåndboken.

4. Bruke @WebAppConfiguration i tester

Nå som vi forstår hvorfor trenger vi å legge til @WebAppConfiguration kommentar i testklassene våre, la oss se hva skjer hvis vi savner å legge det til når vi bruker en WebApplicationContext.

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration utelatt med vilje @ContextConfiguration (klasser = WebConfig.class) offentlig klasse EmployeeTest {@Autowired private WebApplicationContext webAppContext; private MockMvc mockMvc; @ Før offentlig annullering av tomrom () {MockitoAnnotations.initMocks (dette); mockMvc = MockMvcBuilders.webAppContextSetup (webAppContext) .build (); } ...}

Legg merke til at vi kommenterte kommentaren for å simulere scenariet der vi glemmer å legge det til. Her er det lett å se hvorfor testen mislykkes når vi kjører JUnit-testen: Vi prøver å autoledre WebApplicationContext i en klasse der vi ikke har satt en.

Et mer typisk eksempel er imidlertid en test som bruker en nettaktivert vårkonfigurasjon; det er faktisk nok til å gjøre testen pause.

La oss se:

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration utelatt med vilje @ContextConfiguration (klasser = WebConfig.class) offentlig klasse EmployeeTestWithoutMockMvc {@Autowired private EmployeeController employeeController; ...}

Selv om eksemplet ovenfor ikke er automatisk ledning a WebApplicationContext det vil fortsatt mislykkes fordi det prøver å bruke en nettaktivert konfigurasjon - WebConfig:

@Configuration @EnableWebMvc @ComponentScan ("com.baeldung.web") offentlig klasse WebConfig implementerer WebMvcConfigurer {...}

Kommentaren @EnableWebMvc er den skyldige her - som i utgangspunktet vil kreve en nettaktivert vårkontekst, og uten den - vil vi se testen mislykkes:

Forårsaket av: org.springframework.beans.factory.NoSuchBeanDefinitionException: Ingen kvalifiserende bønner av typen [javax.servlet.ServletContext] funnet for avhengighet: forventet minst 1 bønne som kvalifiserer som autowire-kandidat for denne avhengigheten. Avhengighetsanoteringer: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} at osbfsDefaultListableBeanFactory .raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1373) at osbfsDefaultListableBeanFactory. resolDependency (DefaultListableBeanFactory.java:1014) at osbfaAutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement .inject (AutowiredAnnotationBeanPostProcessor.java:545) ... 43 mer

Så det er problemet vi enkelt løser ved å legge til @WebAppConfiguration kommentar til testene våre.

5. Konklusjon

I denne artikkelen viste vi hvordan vi kan la TestContext rammeverk for å laste en WebApplicationContext inn i våre integrasjonstester bare ved å legge til kommentaren.

Til slutt så vi på eksemplene, selv om vi legger til @Kontekstkonfigurasjon til testen, vil dette ikke kunne fungere med mindre vi legger til @WebAppConfiguration kommentar.

Implementeringen av eksemplene i denne artikkelen er tilgjengelig i vårt depot på GitHub.


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