1. 개요
이 기사에서는 Spring 의 @WebAppConfiguration 어노테이션, 통합 테스트에 필요한 이유 및 이러한 테스트가 실제로 WebApplicationContext를 부트 스트랩하도록 구성하는 방법을 살펴 보겠습니다 .
2. @WebAppConfiguration
간단히 말해서 이것은 Spring Framework에서 애플리케이션 컨텍스트의 웹 버전을 생성하는 데 사용되는 클래스 레벨 어노테이션입니다.
테스트를 위해 부트 스트랩 된 ApplicationContext 가 WebApplicationContext 의 인스턴스 여야 함 을 나타내는 데 사용됩니다 .
사용법에 대한 빠른 메모 – WebApplicationContext 가 MockMvc 개체 를 빌드하는 데 사용 되기 때문에 일반적으로 통합 테스트에서이 어노테이션을 찾을 수 있습니다. 여기 에서 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 어노테이션을 추가하지 않으면 작동하지 않는 예를 살펴 보았습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-webappconfiguration
'Java' 카테고리의 다른 글
Spring Security : 유저 Role 확인 방법 (0) | 2021.03.15 |
---|---|
Apache Meecrowave로 마이크로 서비스 구축 (0) | 2021.03.15 |
Spring REST 및 AngularJS 테이블을 사용한 페이지 매김 (0) | 2021.03.15 |
Spring REST API에 대한 요청 제한 시간 설정 (0) | 2021.03.14 |
코어 자바의 동작 패턴 (0) | 2021.03.14 |