Spring - 테스트 코드 작성하기
테스트의 목적은 설계를 검증하기 위함이다. 어떠한 목적을 이루기 위한 비즈니스 로직을 설계하고 해당 설계가 제대로된 결과값을 내는지를 검증하기 위해 이용한다. 테스트를 작성함으로써 검증 및 예상되는 문제를 미리 확인할 수 있다는 장점이 있다.
Spring은 JUnit 프레임워크의 어노테이션을 이용하여 테스트를 명시하고 실행할 수 있다. 어노테이션은 다음과 같이 크게 3가지 분류로 나누어 볼 수 있다.
- 테스트 환경 설정 어노테이션
- 테스트 생명주기 관련 어노테이션
- 실제 테스트를 진행을 위한 어노테이션
테스트 환경 설정 어노테이션
어떤 환경에서 테스트를 실행할지에 대한 어노테이션들이다. 각 어노테이션들은 통합테스트, 단위테스트, 데이터 레이어 테스트인지에 따라 테스트 환경구성을 달리 만들어준다. 대표적으로 다음과 같은 어노테이션들이 있다.
@SpringBootTest
- SpringBootApplication 하위의 모든 Bean들을 스캔하여 로드한다.
- 실제 Application Context를 띄우는 것이므로 프로젝트의 크기가 커질수록 빌드 및 실행 시간이 많이 걸린다.
- 통합테스트나 e2e테스트 용도로 많이 사용한다.
@WebMvcTest
- @Controller와 관련된 부분만 테스트할 수 있도록 환경을 설정해준다.
@ExtendWith(MockitoExtension.class)
- Mockito 프레임워크를 사용하겠다는 의미를 가진다.
- 해당 어노테이션이 붙은 클래스에서 가짜객체를 선언할 수 있고 해당 객체를 주입받을 객체또한 선언할 수 있다.
- 의존객체로 인한 부담감을 줄이고 순수하게 해당 메서드의 동작만을 검증하기 위해 사용된다.
- 보통 비즈니스 로직이 존재하는 Service Layer의 테스트 시 많이 이용한다.
- 해당 Layer의 설계 검증을 위한것으로 단위테스트 시 사용한다.
@DataJpaTest
- @Entity로 정의된 JPA 엔티티, @Repository로 정의된 JPA 레포지토리들을 스캔하여 로드합니다.
- 기본적으로 내장 DB를 띄우고 테스트가 끝나면 자동 롤백된다.
- Data Access Layer에 대한 테스트로 실제 쿼리를 테스트하므로 통합테스트에 가깝다.
테스트 생명주기 관련 어노테이션
@BeforeAll
- 해당 클래스의 테스트들을 실행전 실행해야 하는 로직이 들어감(static 메서드로 선언)
@BeforeEach
- 각 테스트 메서드들이 실행되기 전 실행할 로직이 들어감
@AfterAll
- 해당 클래스의 모든 테스트들이 끝난 뒤 처리해야하는 로직이 들어감(static 메서드로 선언)
@AfterEach
- 각 테스트 메서드들이 실행된 후에 실행할 로직이 들어감
실제 테스트 진행을 위한 어노테이션
@Test
- 테스트를 진행할 메서드를 의미
@Mock
- 내부가 빈 Mock객체를 생성시켜주는 어노테이션
@InjectMock
@Mock
으로 만든 가짜 객체를 주입시킬 객체
댓글남기기