단위테스트 ‐ Repository 계층 - f-lab-edu/jshop GitHub Wiki

Repository 계층에서는 데이터의 접근을 담당한다. 주로 쿼리와 JPA를 사용해 엔티티를 다룬다.

리포지토리 계층에서 테스트할내용은 정의한대로 데이터를 주고받는지에 대해 확인하려 한다.

실제 데이터가 저장되고, 불러와지는지를 봐야하기 때문에 목이나, 스텁으로는 확인할 수 없다. 때문에 H2 데이터베이스를 메모리에 띄워서 확인해보기로 했다.

아래는 유저 레포지토리의 간단한 회원가입 테스트 코드다.

save 메서드로 회원을 저장하고, findByEmail 메서드로 회원을 찾을때 정상적으로 동작하는지를 검증한다.

이때 사용된 몇가지 어노테이션에 대해 알아본다.

@DataJpaTest
public class UserRepositoryTest {

  @Autowired
  private UserRepository userRepository;

  @Test
  public void 회원가입() {
    // given
    User user = User.builder()
        .email("test")
        .userType(UserType.USER)
        .username("kim")
        .password("kim")
        .build();

    // when
    userRepository.save(user);

    // then
    User findUser = userRepository.findByEmail("test");
    assertThat(findUser).isEqualTo(user);
  }
}

@DataJpaTest

DataJpaTest 어노테이션은 JPA와 Spring Data Jpa를 테스트하기 위해 사용한다.

@Entity를 스캔하고, 기본적으로 데이터베이스를 메모리에 띄워서 사용한다. 또한 @Transactional이 있어, 각 테스트마다 롤백이 된다.

@SpringBootTest에 비해 다른 컴포넌트 스캔이 동작하지 않고 엔티티에 대한 스캔만 동작하기 때문에 훨씬 가볍게 동작해 리포지토리 계층의 단위테스트에 적합하다.

주의할 점

영속성 컨텍스트에 저장된 변경사항은 커밋이 되지 않고 롤백이 되면 수행되지 않는다.

테스트시 @Transactional 에서 이루어지게 된다. 테스트에서 별도로 설정을 하지 않는다면 @Transactional은 테스트가 끝나면 롤백된다.

즉 단순 저장과 같은 쿼리들은 실제로 수행되지 않을 수 있다. 이를 모르고 로그에 쿼리가 남지 않아 한참 찾아봤다..