TIL 2023/12/01 Spring 단위테스트 자세히

YEONGDO·2023년 12월 1일
0

테스트 코드 작성 공통 준수 사항

  • 보통 테스트를 위한 라이브러리로 JUnit과 AssertJ 조합을 사용하여 테스트를 한다.
  • Given/When/Then 패턴
    • Given : 어떠한 데이터가 주어질 때.
    • When : 어떠한 기능을 실행하면.
    • Then : 어떠한 결과를 기대한다.

Mockito를 사용한 단위 테스트

  • 모키토는, 개발자가 동작을 직접적으로 제어할 수 있는 가짜 객체를 지원하는 테스트 프레임웍이다.
  • Spring 어플리케이션은 여러 객체들 간의 의존성이 생기는데 이러한 의존성을 모키토를 이용하여 단절 시킴으로 단위 테스트를 쉽게 작성하는 것을 도와준다.
  • 앞으로 작성할 예제 테스트 에서는 모키토와 JUnit5의 조합으로 테스트 코드를 작성할 것 이다.

컨트롤러 계층 단위 테스트

  • 컨트롤러의 단위 테스트를 하기 위해서 Mockito를 이용하여 다른 계층과 의존관계를 단절 시켜 주어야한다.
  • 컨트롤러가 의존하고 있는 객체는 MemberService와 MemberMapper 객체다.
  • 컨트롤러를 테스트 하기 위해서는 HTTP 호출이 필요하다. 스프링 부트는 컨트롤러 테스트를 위한 @WebMvcTest 어노테이션을 제공한다.
  • 이를 이용하면 MockMvc 객체가 자동으로 생성될 뿐만 아니라 테스트에 필요한 요소들을 빈으로 등록해 스프링 컨텍스트 환경을 구성 해 준다.

서비스 계층 단위 테스트

  • 예제 서비스 코드에서 MemberService는 MemberRepository에 의존 하고 있다.
  • 서비스 계층은 HTTP 호출과 상관 없으며 단순한 로직 검증만 하면 된다.
  • Repository에 저장하는 로직은 단순하기 때문에 입력된 회원 정보가 중복 될시 예외가 발생하는 경우를 테스트 하였다.

레포지토리 계층 단위 테스트

  • @DataJpaTest 어노테이션은, 스프링 부트에서 JPA 레포지토리를 쉽게 테스트 할수 있게 지원 한다.
  • 해당 프로젝트에서는 H2 인메모리 DB를 구축해 놓았고, @DataJpaTest 어노테이션은 기본적으로 H2를 기반으로 테스트하며, 테스트가 끝나면 트랜잭션 롤백을 한다.
  • 실제 DB와 통신을 하지 않으면 테스트의 의미가 없으므로, 목킹은 하지 않는다.
profile
개발 블로그

0개의 댓글