barded

[무물] 2-1.계층별 단위테스트 - Repository 본문

프로젝트/무물

[무물] 2-1.계층별 단위테스트 - Repository

barded 2024. 6. 6. 14:42

Repository 계층의 단위 테스트 역할

Repository 계층의 단위 테스트는 Mock객체 없이 데이터베이스와의 상호 작용이 올바르게 이루어지는지만 확인하면 된다.

PostRepositoryTest

@DataJpaTest
@ActiveProfiles("test")
@Import(QuerydslConfig.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class PostRepositoryTest {

    private final String USERNAME = "test";

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private PostRepository postRepository;

    @BeforeEach
    void setUp() {
        User user = userRepository.save(User.builder()
            .username(USERNAME)
            .nickname("test")
            .content("test")
            .build());

        User save = userRepository.save(user);

        Post post = Post.builder()
            .content("내용")
            .nickname("닉네임")
            .postType(PostType.FROM_ME)
            .reply("답글")
            .user(user)
            .build();

        postRepository.save(post);
      }

    @Test
    @DisplayName("유저 아이디로 찾기")
    public void findByUserId() throws Exception {
        //given
        PageRequest pageRequest = PageRequest.of(0, 10);
        User user = userRepository.findByUsername(USERNAME).get();
        //when
        List<Post> findPost = postRepository.findByUserId(user.getId(), PostType.FROM_ME, pageRequest);
        //then
        assertThat(findPost.size()).isEqualTo(2);
    }
}

Repository 계층의 Annotation들

  • @DataJpaTest:
    • 이 어노테이션은 Spring Data JPA와 관련된 테스트를 작성할 때 사용함.
    • JPA 리포지토리, 엔티티 관련 컴포넌트들을 테스트하기 위한 슬라이스 테스트를 지정함.
    • 이 어노테이션을 사용하면, 인메모리 데이터베이스를 사용하여 테스트를 수행하고, 실제 데이터베이스에 영향을 주지 않고 테스트를 할 수 있음.
  • @ActiveProfiles("test"):
    • 특정한 프로파일을 활성화하여 테스트를 진행할 때 사용함.
    • 위의 코드에서는 "test" 프로파일이 활성화되어, 테스트를 위한 설정이나 환경 변수를 적용함.
  • @Import(QuerydslConfig.class):
    • 이 어노테이션은 지정된 클래스나 설정 파일을 현재 테스트에 import하여 사용할 수 있도록 함.
    • 위의 코드에서는 QuerydslConfig 클래스를 import하여 Querydsl 설정을 테스트에 적용함.
  • @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE):
    • 테스트 데이터베이스의 자동 구성을 제어하는 어노테이션임.
    • replace 속성을 사용하여 테스트 데이터베이스를 어떻게 구성할지 지정할 수 있음.
    • 위의 코드에서는 NONE으로 설정하여, 실제 데이터베이스를 사용하도록 함. 즉, 테스트는 실제 데이터베이스를 사용하여 실행됨.
  • @Autowired:
    • 스프링 프레임워크가 자동으로 의존성을 주입하기 위해 사용되는 어노테이션이다. 이를 통해 개발자는 초기화 없이도 객체를 사용할 수 있다.
  • @BeforeEach:
    • 각각의 테스트 메소드가 실행되기 전에 실행되어야 하는 메소드를 지정하는 데 사용된다. 주로 테스트 환경을 초기화하는 데 사용된다.
  • @Test:
    • 해당 메소드가 JUnit에 의해 테스트 메소드임을 명시하는 어노테이션이다. 이 어노테이션을 사용함으로써 JUnit은 해당 메소드를 테스트 케이스로 실행한다.
  • @DisplayName:
    • 테스트 클래스나 메소드에 대한 이름을 지정하는 데 사용된다. 이 이름은 테스트 실행 결과에서 확인할 수 있어 테스트의 목적이나 실행 내용을 명확하게 설명할 수 있다.

Repository의 Given-When-Then

  • given:
    • 이 부분에서는 테스트에 필요한 사전 조건이나 설정을 준비함.
    • PageRequest 객체를 생성하고, USERNAME으로 User 객체를 찾아서 초기화하는 과정을 진행함. 이는 테스트를 실행하기 전에 필요한 데이터의 상태를 설정함으로써, 테스트가 일관된 환경에서 실행될 수 있도록 보장함.
  • when:
    • when 부분에서는 실제로 테스트하고자 하는 행위나 로직을 실행함.
    • 이 예시에서는 postRepository의 findByUserId 메소드를 호출하여, 특정 사용자 ID에 해당하는 게시글을 조회하는 기능을 테스트함. 이 단계에서는 테스트의 핵심이 되는 동작이 이루어지며, 이 동작의 결과를 이후 단계에서 검증함.
  • then:
    • then 부분에서는 when 단계에서 실행된 행위의 결과를 검증함.
    • 이 경우, assertThat을 사용하여 findByUserId 메소드의 결과로 나온 게시글 목록의 크기가 기대한 값(2)과 일치하는지 확인함. 이 단계는 테스트가 성공적으로 수행되었는지, 즉 기대한 조건을 만족하는지를 검사함으로써, 테스트의 목적을 달성함.

[무물] 1. 단위테스트 / 통합 테스트 란?

[무물] 2-1.계층별 단위테스트 - Repository

[무물] 2-2. 계층별 단위테스트 - Service

[무물] 2-3. 계층별 단위테스트 - Controller

[무물] 3-1. 통합테스트  MockMvc vs. WebTestClient vs. TestRestTemplate

[무물] 3-2. 통합테스트

[무물] 4. 단위 테스트 네이밍 컨벤션