WebAppConfiguration in Spring Tests

1. Overzicht

In dit artikel zullen we de @WebAppConfiguration annotatie in het voorjaar, waarom we het nodig hebben in onze integratietests en ook hoe we het kunnen configureren zodat deze tests daadwerkelijk een bootstrap WebApplicationContext.

2. @WebAppConfiguration

Simpel gezegd, dit is een annotatie op klassenniveau die wordt gebruikt om een ​​webversie van de toepassingscontext in het Spring Framework te maken.

Het wordt gebruikt om aan te geven dat de ApplicationContext die is bootstrapped voor de test zou een instantie moeten zijn van WebApplicationContext.

Een korte opmerking over het gebruik - we vinden deze annotatie meestal in integratietests omdat de WebApplicationContext wordt gebruikt om een MockMvc voorwerp. Meer informatie over integratietesten met Spring vind je hier.

3. Het laden van een WebApplicationContext

Vanaf Spring 3.2 is er nu ondersteuning voor het laden van een WebApplicationContext in integratietests:

@WebAppConfiguration @ContextConfiguration (classes = WebConfig.class) openbare klasse EmployeeControllerTest {...} 

Dit instrueert het TestContext kader dat a WebApplicationContext moet worden geladen voor de test.

En op de achtergrond een MockServletContext is gemaakt en geleverd aan onze tests WebApplicationContext Door de TestContext kader.

3.1. Configuratie-opties

Standaard is het basisbronpad voor het WebApplicationContext wordt ingesteld op "File: src / main / webapp", wat de standaardlocatie is voor de root van de WAR in een Maven-project.

We kunnen dit echter opheffen door simpelweg een alternatief pad naar het @WebAppConfiguration annotatie:

@WebAppConfiguration ("src / test / webapp")

We kunnen ook verwijzen naar een basisbronpad vanuit het klassenpad in plaats van naar het bestandssysteem:

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

3.2. Caching

Zodra het WebApplicationContext wordt geladen, wordt het in de cache opgeslagen en opnieuw gebruikt voor alle volgende tests die dezelfde unieke contextconfiguratie binnen dezelfde testsuite aangeven.

Voor meer details over caching, kunt u de sectie Context caching van de referentiehandleiding raadplegen.

4. Met behulp van @WebAppConfiguration in tests

Nu we begrijpen waarom we het @WebAppConfiguration annotatie in onze testklassen, laten we eens kijken wat gebeurt er als we het niet toevoegen? wanneer we een WebApplicationContext.

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration met opzet weggelaten @ContextConfiguration (classes = WebConfig.class) openbare klasse EmployeeTest {@Autowired private WebApplicationContext webAppContext; privé MockMvc mockMvc; @Before public void setup () {MockitoAnnotations.initMocks (dit); mockMvc = MockMvcBuilders.webAppContextSetup (webAppContext) .build (); } ...}

Merk op dat we de annotatie hebben becommentarieerd om het scenario te simuleren waarin we vergeten zijn toe te voegen. Hier is het gemakkelijk te zien waarom de test zal mislukken wanneer we de JUnit-test uitvoeren: we proberen het WebApplicationContext in een klas waar we er geen hebben ingesteld.

Een meer typisch voorbeeld is echter een test die een web-enabled Spring-configuratie gebruikt; dat is eigenlijk genoeg om de test te breken.

Laten we eens kijken:

@RunWith (SpringJUnit4ClassRunner.class) // @WebAppConfiguration expres weggelaten @ContextConfiguration (classes = WebConfig.class) openbare klasse EmployeeTestWithoutMockMvc {@Autowired private EmployeeController employeeController; ...}

Ook al is het bovenstaande voorbeeld geen automatische bedrading a WebApplicationContext het zal nog steeds mislukken omdat het probeert een webconfiguratie te gebruiken - Webconfiguratie:

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

De annotatie @EnableWebMvc is hier de boosdoener - dat vereist in feite een web-enabled Spring-context, en zonder dit - zullen we zien dat de test mislukt:

Veroorzaakt door: org.springframework.beans.factory.NoSuchBeanDefinitionException: Geen kwalificerende bean van het type [javax.servlet.ServletContext] gevonden voor afhankelijkheid: verwacht ten minste 1 bean die kwalificeert als autowire-kandidaat voor deze afhankelijkheid. Dependency-annotaties: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} op osbfsDefaultListableBeanFactory .raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1373) bij osbfsDefaultListableBeanFactory .raiseNoSuchBeanDefinitionException (DefaultListableBeanFactory.java:1373) op osbfsDefaultSaveListable. resolDependency (DefaultListableBeanFactory.java:1014) bij osbfaAutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement .inject (AutowiredAnnotationBeanPostProcessor.java:545) ... 43 meer

Dus dat is het probleem dat we gemakkelijk kunnen oplossen door de extensie @WebAppConfiguration annotatie bij onze tests.

5. Conclusie

In dit artikel hebben we laten zien hoe we de TestContext framework om een WebApplicationContext in onze integratietests door gewoon de annotatie toe te voegen.

Ten slotte hebben we gekeken naar de voorbeelden die, hoewel we de @ toevoegen,ContextConfiguration op de test, dit zal niet kunnen werken, tenzij we de @WebAppConfiguration annotatie.

De implementatie van de voorbeelden in dit artikel is beschikbaar in onze repository op GitHub.