Back-End/Springboot와 AWS로 혼자 구현하는 웹 서비스

Chapter 03. SpringBoot에서 JPA로 데이터베이스 다뤄보자 (3)

yeonx 2022. 3. 12. 13:03
728x90

3.3 Spring Data JPA 테스트 코드 작성하기

 

1. test 디렉토리에 domain.posts 패키지를 생성하고, 테스트 클래스는 PostsRepositoryTest란 이름으로 생성

PostsRepositoryTest 패키지와 클래스

 

PostsRepositoryTest에서는 다음과 같이 save, findAll 기능을 테스트한다.

package com.jojoldu.book.springboot.domain.posts;

import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

    @After // ①
    public void cleanup(){
        postsRepository.deleteAll();
    }

    @Test
    public void 게시글저장_불러오기(){
        //given
        String title = "테스트 게시글";
        String content = "테스트 본문";

        postsRepository.save(Posts.builder() // ②
                .title(title)
                .content(content)
                .author("jojoldu@gmail.com")
                .build());

        //when
        List<Posts> postsList = postsRepository.findAll(); // ③

        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);

    }
}

 

@After
- Junit에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정
- 보통은 배포 전 전체 테스트를 수행할 때 테스트간 데이터 침범을 막기 위해 사용
- 여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그대로 남아 있어 다음 테스트 실행 시 테스트가 실패할 수 있음

@postsRepository.save
- 테이블 posts에 insert/update 쿼리를 실행
- id 값이 있다면 update가, 없다면 insert 쿼리가 실행됨

@postsRepository.findAll
- 테이블posts에 있는 모든 데이터를 조회해오는 메소드

 

별다른 설정 없이 @SpringBootTest를 사용할 경우 H2 데이터베이스를 자동으로 실행해 줌

(위 test역시 H2가 자동 실행)

 

2. 위에서 구현한 테스트 코드 실행

PostsRepositoryTest 테스트 실행

3. 테스트 완료

test 결과

 

 

출처 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 [이동욱 지음]