스프링 공식 문서에서는 스프링에서의 testing 지원에 대해 자세히 설명하고 있다.
👉 스프링 framework 공식문서 ver.5.3.22
스프링 컨테이너 없이 단위테스트를 한다.
단위 테스트에서는 클래스 작성 시
생성자에 필요한 dependency를 주입할 때, 굳이 autowired
로 만들지 않고도
생성자에 Mock Object
를 작성해서 주입할 수 있다.
컨테이너
없이 단위 테스트 코드 작성이 가능한 것이다.
spring framework에서 제공하는 Mock Objects에 대한 기능이 있다.
스프링에서는 Mock Object로 만들기 어려운 것들에 대한 기능을 제공해준다.
만일 Environment
에 대한 dependency가 있을 때, 스프링 환경에서 테스트 코드 작성 시
스프링의 Mock Object
를 이용해서 쉽게 Environment의 Mock을 만들 수 있는 것이다.
General Testing Utilities
Spring MVC Testing Utilities
이처럼 스프링에서 제공되는 Util 코드를 이용해서 쉽게 단위테스트 코드를 작성할 수도 있다.
그런데 실제 단위 테스트 코드 작성 시에는
의존관계 없이 핵심 로직을 잘 작성하는 것이 중요하다.
핵심 로직에 대한 Happy Flow와 Edge Case등
핵심 비즈니스 로직은 spring FrameWork에 의존적이지 않게 작성하는 것이 좋다.
실제 스프링에서 가장 많이 support해주는 부분은 통합 테스트이다.
통합 테스트 시 실제 서버를 띄우지 않고
스프링 컨테이너 내에서 각각 등록된 Bean들 사이의 연동되는 부분에 대한 테스트가 필요할 때가 있다.
실제 Bean들 간의 커뮤니케이션을 봐야할 필요가 있다.
이때 스프링 컨테이너가 필요하다.
Spring TestContext Framework를 이용하면
테스트 환경에서 어플리케이션 컨텍스트를 어노테이션 사용만으로 쉽게 만들 수가 있다.
어플리케이션 컨텍스트는 캐시 기능
이 되기 때문에
같은 내용의 컨테이너
라면 매번 새로 만들 필요 없이
기존의 컨테이너를 재사용해서 빠르게 테스트를 구동시킬 수 있다.
(컨테이너를 만드는 것은 상당히 비싼 행위다.)
TestContext를 관리해주는 것이 바로 TestContextManager이다.
모든 것은 스프링 내부에서 동작하며
테스트 코드 작성 시 TestContextManager를 호출하는 것이 아니라
@ContextConfiguration 을 사용하면 된다.