1. 개요

이 기사에서는 Spring @WebAppConfiguration 어노테이션, 통합 테스트에 필요한 이유 및 이러한 테스트가 실제로 WebApplicationContext를 부트 스트랩하도록 구성하는 방법을 살펴 보겠습니다 .

2. @WebAppConfiguration

간단히 말해서 이것은 Spring Framework에서 애플리케이션 컨텍스트의 웹 버전을 생성하는 데 사용되는 클래스 레벨 어노테이션입니다.

테스트를 위해 부트 스트랩 된 ApplicationContextWebApplicationContext 의 인스턴스 여야 함 을 나타내는 데 사용됩니다 .

사용법에 대한 빠른 메모 – WebApplicationContextMockMvc 개체 를 빌드하는 데 사용 되기 때문에 일반적으로 통합 테스트에서이 어노테이션을 찾을 수 있습니다. 여기 에서 Spring과의 통합 테스트에 대한 자세한 정보를 찾을 수 있습니다 .

3. WebApplicationContext 로드

Spring 3.2부터 통합 테스트에서 WebApplicationContext 로드를 지원 합니다 .

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

이것은 TestContext 프레임 워크에 WebApplicationContext 가 테스트를 위해로드되어야한다는 것을 지시합니다 .

그리고 백그라운드에서 MockServletContext 가 생성 되어 TestContext 프레임 워크에 의해 테스트의 WebApplicationContext제공됩니다 .

3.1. 구성 옵션

기본적으로의 기본 자원 경로 의 WebApplicationContext가 설정됩니다 : "SRC / 메인 / 웹 애플리케이션 파일", 메이븐 프로젝트에서 WAR의 루트의 기본 위치입니다.

그러나 단순히 @WebAppConfiguration 어노테이션에 대한 대체 경로를 제공하여이를 재정의 할 수 있습니다 .

@WebAppConfiguration("src/test/webapp")

파일 시스템 대신 클래스 경로에서 기본 리소스 경로를 참조 할 수도 있습니다.

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

3.2. 캐싱

WebApplicationContext가로되면 동일한 테스트 스위트 내에서 동일한 고유 컨텍스트 구성을 선언하는 모든 후속 테스트에 대해 캐시되고 재사용됩니다.

캐싱에 대한 자세한 내용 은 참조 매뉴얼 컨텍스트 캐싱 섹션을 참조하십시오.

4. 테스트에서 @WebAppConfiguration 사용

이제 테스트 클래스에 @WebAppConfiguration 어노테이션 을 추가해야하는 이유를 이해 했으므로 WebApplicationContext를 사용할 때 추가하지 못한 경우 어떻게되는지 살펴 보겠습니다 .

@RunWith(SpringJUnit4ClassRunner.class)
// @WebAppConfiguration omitted on purpose
@ContextConfiguration(classes = WebConfig.class)
public class EmployeeTest {

    @Autowired
    private WebApplicationContext webAppContext;
    private MockMvc mockMvc;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build();
    }
    
    ...
}

어노테이션을 추가하는 것을 잊은 시나리오를 시뮬레이션하기 위해 어노테이션을 달았습니다. 여기서 JUnit 테스트를 실행할 때 테스트가 실패하는 이유를 쉽게 알 수 있습니다 . WebApplicationContext 를 설정하지 않은 클래스에서 자동 연결 하려고합니다 .

그러나 더 일반적인 예는 웹 기반 Spring 구성을 사용하는 테스트입니다. 실제로 테스트를 중단하기에 충분합니다.

한 번 살펴 보겠습니다.

@RunWith(SpringJUnit4ClassRunner.class)
// @WebAppConfiguration omitted on purpose
@ContextConfiguration(classes = WebConfig.class)
public class EmployeeTestWithoutMockMvc {

    @Autowired
    private EmployeeController employeeController;

    ...
}

위의 예제가 WebApplicationContext 를 자동 연결하지 않더라도 웹 사용 구성 – WebConfig 를 사용하려고하기 때문에 여전히 실패합니다 .

@Configuration
@EnableWebMvc
@ComponentScan("com.baeldung.web")
public class WebConfig implements WebMvcConfigurer {
    ...
}

@EnableWebMvc 어노테이션 이 여기서 범인입니다. 기본적으로 웹 사용 Spring 컨텍스트가 필요 하며이 컨텍스트가 없으면 테스트가 실패합니다.

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
  No qualifying bean of type [javax.servlet.ServletContext] found for dependency: 
    expected at least 1 bean which qualifies as autowire candidate for this dependency. 

Dependency annotations: 
  {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at o.s.b.f.s.DefaultListableBeanFactory
      .raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373)
    at o.s.b.f.s.DefaultListableBeanFactory
      .doResolveDependency(DefaultListableBeanFactory.java:1119)
    at o.s.b.f.s.DefaultListableBeanFactory
      .resolveDependency(DefaultListableBeanFactory.java:1014)
    at o.s.b.f.a.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement
      .inject(AutowiredAnnotationBeanPostProcessor.java:545)
    ... 43 more

이것이 바로 테스트에 @WebAppConfiguration 어노테이션을 추가하여 쉽게 고칠 수있는 문제입니다 .

5. 결론

이 기사에서는 어노테이션을 추가하는 것만으로 TestContext 프레임 워크가 WebApplicationContext 를 통합 테스트 에로드 하도록하는 방법을 보여주었습니다 .

마지막으로 @ ContextConfiguration 을 테스트에 추가하더라도 @WebAppConfiguration 어노테이션을 추가하지 않으면 작동하지 않는 예를 살펴 보았습니다 .

이 기사의 예제 구현은 GitHub 의 저장소에서 사용할 수 있습니다 .