WebAppConfiguration i Spring Tests

1. Oversigt

I denne artikel undersøger vi @WebAppConfiguration kommentar om foråret, hvorfor vi har brug for det i vores integrationstest, og hvordan kan vi konfigurere det, så disse tests faktisk starter en WebApplicationContext.

2. @WebAppConfiguration

Kort sagt, dette er en klassemeddelelse, der bruges til at oprette en webversion af applikationskonteksten i Spring Framework.

Det bruges til at betegne, at ApplicationContext som er bootstrapped til testen, skal være en forekomst af WebApplicationContext.

En hurtig note om brug - vi finder normalt denne kommentar i integrationstest, fordi WebApplicationContext bruges til at bygge en MockMvc objekt. Du kan finde flere oplysninger om integrationstest med Spring her.

3. Indlæsning a WebApplicationContext

Fra og med Spring 3.2 er der nu understøttelse af indlæsning af a WebApplicationContext i integrationstest:

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

Dette instruerer TestContext ramme, som en WebApplicationContext skal indlæses til testen.

Og i baggrunden a MockServletContext oprettes og leveres til vores test WebApplicationContext ved TestContext ramme.

3.1. Konfigurationsindstillinger

Som standard er basisressourcestien til WebApplicationContext vil blive indstillet til "Fil: src / main / webapp", som er standardplaceringen for WAR-roden i et Maven-projekt.

Vi kan dog tilsidesætte dette ved blot at give en alternativ sti til @WebAppConfiguration kommentar:

@WebAppConfiguration ("src / test / webapp")

Vi kan også henvise til en basisressourcesti fra klassestien i stedet for filsystemet:

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

3.2. Caching

En gang WebApplicationContext er indlæst, caches den og genbruges til alle efterfølgende tests, der erklærer den samme unikke kontekstkonfiguration inden for den samme testpakke.

For yderligere oplysninger om caching kan du se afsnittet Context caching i referencehåndbogen.

4. Brug @WebAppConfiguration i test

Nu hvor vi forstår, hvorfor skal vi tilføje @WebAppConfiguration kommentar i vores testklasser, lad os se hvad sker der, hvis vi savner at tilføje det når vi bruger en WebApplicationContext.

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

Bemærk, at vi kommenterede kommentaren for at simulere scenariet, hvor vi glemmer at tilføje det. Her er det let at se, hvorfor testen mislykkes, når vi kører JUnit-testen: vi forsøger at tråde kablet automatisk WebApplicationContext i en klasse, hvor vi ikke har sat en.

Et mere typisk eksempel er dog en test, der bruger en web-aktiveret Spring-konfiguration; det er faktisk nok til at gøre testen pause.

Lad os kigge på det:

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

Selvom ovenstående eksempel ikke er automatisk ledning a WebApplicationContext det mislykkes stadig, fordi det forsøger at bruge en webbaseret konfiguration - WebConfig:

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

Annotationen @EnableWebMvc er synderen her - der grundlæggende vil kræve en internetaktiveret forårssammenhæng, og uden den - vil vi se testen mislykkes:

Forårsaget af: org.springframework.beans.factory.NoSuchBeanDefinitionException: Ingen kvalificerende bønne af typen [javax.servlet.ServletContext] fundet for afhængighed: forventes mindst 1 bønne, der kvalificerer som autowire-kandidat for denne afhængighed. Afhængighedsanmærkninger: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} at osbfsDefaultListableBeanFactory .raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1373) at osbfsDefaultListableBeanFactory. resolDependency (DefaultListableBeanFactory.java:1014) på ​​osbfaAutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement .inject (AutowiredAnnotationBeanPostProcessor.java:545) ... 43 mere

Så det er problemet, som vi nemt løser ved at tilføje @WebAppConfiguration kommentar til vores test.

5. Konklusion

I denne artikel viste vi, hvordan vi kan lade TestContext ramme for at indlæse en WebApplicationContext ind i vores integrationstest bare ved at tilføje kommentaren.

Endelig kiggede vi på eksemplerne, at selvom vi tilføjer @Kontekstkonfiguration til testen kan dette ikke fungere, medmindre vi tilføjer @WebAppConfiguration kommentar.

Implementeringen af ​​eksemplerne i denne artikel er tilgængelig i vores lager på GitHub.


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