Loading...
Spring Framework Reference Documentation 7.0.2의 Unit Testing의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Dependency injection은 전통적인 J2EE / Java EE 개발을 사용할 때보다 코드가 컨테이너에 덜 의존적이도록 만들어야 합니다. 애플리케이션을 구성하는 POJO들은 new operator를 사용해서 객체를 인스턴스화하고, Spring이나 다른 어떤 컨테이너 없이도 JUnit 또는 TestNG 테스트에서 테스트 가능해야 합니다. mock objects (다른 유용한 테스트 기법들과 함께)을 사용해서 코드를 고립된 상태에서 테스트할 수 있습니다.
Spring에 대한 아키텍처 권장사항을 따르면, 그 결과로 나오는 코드베이스의 명확한 레이어링과 컴포넌트화는 더 쉬운 단위 테스트를 가능하게 합니다. 예를 들어, 서비스 레이어 객체는 DAO 또는 리포지토리 인터페이스를 스텁 또는 mock 처리해서 테스트할 수 있으며, 단위 테스트를 실행하는 동안 영속 데이터에 접근할 필요가 없습니다.
진정한 단위 테스트는 런타임 인프라를 설정할 필요가 없기 때문에 일반적으로 매우 빠르게 실행됩니다. 개발 방법론의 한 부분으로서 진정한 단위 테스트를 강조하면 생산성을 높일 수 있습니다.
IoC 기반 애플리케이션에 대해 효과적인 단위 테스트를 작성하는 데 이 테스트 챕터의 이 섹션이 필요하지 않을 수도 있습니다. 그러나 특정 단위 테스트 시나리오의 경우, Spring Framework는 이 챕터에서 설명하는 mock 객체와 테스트 지원 클래스를 제공합니다.
Spring에는 mocking을 위해 전용으로 제공되는 여러 패키지가 포함되어 있습니다:
org.springframework.mock.env 패키지에는 Environment와 PropertySource abstraction의 mock 구현이 포함되어 있습니다(참고: Bean Definition Profiles 및 PropertySource Abstraction).
MockEnvironment와 MockPropertySource는 환경별 프로퍼티에 의존하는 코드에 대해 컨테이너 외부 테스트를 개발하는 데 유용합니다.
org.springframework.mock.web 패키지에는 웹 컨텍스트, 컨트롤러, 필터를 테스트하는 데 유용한 포괄적인 Servlet API mock 객체 세트가 포함되어 있습니다. 이러한 mock 객체는 Spring의 Web MVC 프레임워크에서의 사용을 목표로 하며, 일반적으로 동적 mock 객체(예: EasyMock)보다 사용하기 더 편리합니다.
Spring Framework 7.0부터
org.springframework.mock.web의 mock 객체는 Servlet 6.1 API를 기반으로 합니다.
MockMvc는 mock Servlet API 객체 위에서 동작하여 Spring MVC를 위한 통합 테스트 프레임워크를 제공합니다. MockMvc를 참고하세요.
org.springframework.mock.http.server.reactive 패키지에는 WebFlux 애플리케이션에서 사용하기 위한 ServerHttpRequest와 ServerHttpResponse의 mock 구현이 포함되어 있습니다. org.springframework.mock.web.server 패키지에는 이러한 mock request와 response 객체에 의존하는 mock ServerWebExchange가 포함되어 있습니다.
MockServerHttpRequest와 MockServerHttpResponse는 모두 서버별 구현과 동일한 추상 기본 클래스를 확장하며, 그들과 동작을 공유합니다. 예를 들어, mock request는 일단 생성되면 immutable이지만, ServerHttpRequest의 mutate() 메서드를 사용해서 수정된 인스턴스를 생성할 수 있습니다.
mock response가 write contract를 올바르게 구현하고 write completion handle(즉, Mono<Void>)을 반환하기 위해, 기본적으로 cache().then()이 적용된 Flux를 사용하며, 이는 데이터를 버퍼하고 테스트에서 assertion에 사용할 수 있도록 합니다. 애플리케이션은 커스텀 write 함수를 설정할 수 있습니다 (예를 들어, 무한 스트림을 테스트하기 위해).
WebTestClient는 mock request와 response 위에서 동작하여 HTTP 서버 없이 WebFlux 애플리케이션을 테스트하기 위한 지원을 제공합니다. 이 클라이언트는 실행 중인 서버를 사용하는 엔드 투 엔드 테스트에도 사용할 수 있습니다.
Spring에는 단위 테스트에 도움이 될 수 있는 여러 클래스가 포함되어 있습니다. 이들은 두 가지 카테고리로 나눌 수 있습니다:
org.springframework.test.util 패키지에는 단위 및 통합 테스트에서 사용할 수 있는 여러 범용 유틸리티가 포함되어 있습니다.
AopTestUtils는 AOP 관련 유틸리티 메서드 컬렉션입니다. 이러한 메서드를 사용해서 하나 이상의 Spring 프록시 뒤에 숨겨진 기본 대상 객체에 대한 reference를 얻을 수 있습니다. 예를 들어, EasyMock이나 Mockito와 같은 라이브러리를 사용해서 빈을 동적 mock으로 구성했고, 그 mock이 Spring 프록시로 wrapping되어 있는 경우, expectation을 구성하고 verification을 수행하기 위해 기본 mock에 직접 접근해야 할 수 있습니다. Spring의 core AOP 유틸리티에 대해서는 AopUtils와 AopProxyUtils를 참고하세요.
ReflectionTestUtils는 리플렉션 기반 유틸리티 메서드 컬렉션입니다. 이러한 메서드는 다음과 같은 use case에 대한 애플리케이션 코드를 테스트할 때 constant의 값을 변경하거나, non-public 필드를 설정하거나, non-public setter 메서드를 호출하거나, non-public 설정 또는 라이프사이클 콜백 메서드를 호출해야 하는 테스트 시나리오에서 사용할 수 있습니다:
public setter 메서드 대신 private 또는 protected 필드 접근을 허용하는 ORM 프레임워크(JPA 및 Hibernate 등).private 또는 protected 필드, setter 메서드, 설정 메서드에 대한 dependency injection을 제공하는 @Autowired, @Inject, @Resource 등의 어노테이션에 대한 Spring의 지원.@PostConstruct 및 @PreDestroy와 같은 어노테이션 사용.TestSocketUtils는 통합 테스트 시나리오에서 localhost에서 사용 가능한 TCP 포트를 찾기 위한 간단한 유틸리티입니다.
TestSocketUtils는 사용 가능한 random 포트에서 external 서버를 시작하는 통합 테스트에서 사용될 수 있습니다. 그러나 이러한 유틸리티는 주어진 포트의 이후 가용성에 대해 아무런 보장을 하지 않으므로 신뢰할 수 없습니다. 서버를 위한 사용 가능한 로컬 포트를 찾기 위해TestSocketUtils를 사용하는 대신, 서버가 직접 선택하거나 운영 체제에서 할당한 random ephemeral 포트에서 시작할 수 있는 서버의 기능에 의존하는 것이 좋습니다. 해당 서버와 상호 작용하기 위해, 현재 사용 중인 포트를 서버에 query해야 합니다.
org.springframework.test.web 패키지에는 ModelAndViewAssert가 포함되어 있으며, 이는 Spring MVC ModelAndView 객체를 다루는 단위 테스트에서 JUnit, TestNG 또는 기타 테스트 프레임워크와 조합하여 사용할 수 있습니다.
Unit testing Spring MVC Controllers Spring MVC
Controller클래스를 POJO로 단위 테스트하기 위해서는ModelAndViewAssert를 Spring의 Servlet API mocks에 포함된MockHttpServletRequest,MockHttpSession등과 결합해서 사용하세요. Spring MVC 및 RESTController클래스를 Spring MVC용WebApplicationContext설정과 함께 철저하게 통합 테스트하려면, 대신 MockMvc를 사용하세요.
Introduction to Spring Testing
Integration Testing