barded
[무물] 2-1.계층별 단위테스트 - Repository 본문
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)과 일치하는지 확인함. 이 단계는 테스트가 성공적으로 수행되었는지, 즉 기대한 조건을 만족하는지를 검사함으로써, 테스트의 목적을 달성함.
[무물] 2-1.계층별 단위테스트 - Repository
[무물] 2-3. 계층별 단위테스트 - Controller
[무물] 3-1. 통합테스트 MockMvc vs. WebTestClient vs. TestRestTemplate
'프로젝트 > 무물' 카테고리의 다른 글
[무물] 3-2. 통합테스트 (0) | 2024.06.06 |
---|---|
[무물] 3-1. 통합테스트 MockMvc vs. WebTestClient vs. TestRestTemplate (0) | 2024.06.06 |
[무물] 2-3. 계층별 단위테스트 - Controller (0) | 2024.06.06 |
[무물] 2-2. 계층별 단위테스트 - Service (0) | 2024.06.06 |
[무물] 1. 단위테스트 / 통합 테스트 란? (1) | 2024.06.06 |