4. Spring 토이프로젝트 Entity, Repository

Miz·2021년 5월 23일
0

board-toy-project

목록 보기
4/6

Spring 토이프로젝트 Entity , Repository 간단 Test 코드

간단 repository를 통해 entity 제약조건 테스트

  • 아래 코드와 같은 방식으로 entity builder에서 널처리를 테스트하기 위해 테스트 코드를 작성했습니다.
  • 객체 테스트이기 때문에 @SpringBootTest나 @DataJpaTest등은 사용하지 않았습니다.
  • 다른 코드의 테스트도 동일합니다.
/*
@DataJpaTest 어노테이션은 JPA 관련 테스트 설정만 로드합니다. DataSource의 설정이 정상적인지, JPA를 사용하여 데이터를 제대로 생성, 수정, 삭제하는지 등의 테스트가 가능합니다.
그리고 가장 좋은점은.. 무려 내장형 데이터베이스를 사용하여 실제 데이터베이스를 사용하지 않고 테스트 데이터베이스로 테스트할 수 있는.. 개꿀같은 장점이 있습니다.

@DataJpaTest는 기본적으로 @Entity 어노테이션이 적용된 클래스를 스캔하여 스프링 데이터 JPA 저장소를 구성합니다.
만약 최적하한 별도의 데이터소스를 사용하여 테스트하고 싶다면 기본 설정된 데이터소스를 사용하지 않도록 아래와 같이 설정해도 됩니다.
 */
@DataJpaTest
class BoardRepositoryTest {
    User user;
    String content;
    String title;

    @Autowired
    BoardRepository boardRepository;

    @Autowired
    EntityManager em;

    @BeforeEach
    void beforeEach() {
        user = user.builder()
                .username("test")
                .email("test@test.com")
                .password("test")
                .build();

        content = "content";
        title = "title";
    }
    @Test
    void 제목최대길이실패테스트(){
        title = "testtesttesttesttesttesttesttesttesttesttesttesttesttesttest";

        /*
        DataAccessException의 서브클래스인 세분화 된 예외 클래스를 정의
        BadSqlGrammarException : SQL 문법 오류
        DataAccessResourceFailureException : DB 커넥션을 가져오지 못함
        DataIntegrityViolationException : 제약조건 위반
        DuplicateKeyException : 중복 키
         */
        Board board = Board.builder()
                .title(title)
                .content(content)
                .user(user)
                .build();
        assertThrows(DataIntegrityViolationException.class, () -> {
            boardRepository.save(board);
        });

    }

    @Test
    void 생성_성공테스트() {
        Board board = Board.builder()
                .title(title)
                .content(content)
                .user(user)
                .build();
        boardRepository.save(board);

        //@DataJpaTest에서는 Auditing이 찍히지 않는다.
    }


}

Entity Test

public class BoardTest {

    User user;
    String content;
    String title;



    @BeforeEach
    void beforeEach() {
        user = user.builder()
                .username("test")
                .email("test@test.com")
                .password("test")
                .build();

        content = "content";
        title = "title";
    }

    @Test
    void 게시판생성성공테스트() {
        Board board = Board.builder()
                .content(content)
                .title(title)
                .user(user)
                .build();

        assertThat(board.getContent()).isEqualTo(content);
        assertThat(board.getTitle()).isEqualTo(title);
        assertThat(board.getUser()).isEqualTo(user);
    }
    @Test
    void 게시판제목없은실패테스트() {
        title = "";

        assertThrows(IllegalArgumentException.class, () ->
        {
            Board board = Board.builder()
                    .content(content)
                    .title(title)
                    .user(user)
                    .build();
        });
        assertThrows(IllegalArgumentException.class, () ->
        {
            Board board = Board.builder()
                    .content(content)
                    .title(null)
                    .user(user)
                    .build();
        });
    }
    @Test
    void 게시판내용없음실패테스트() {
        content = "";

        assertThrows(IllegalArgumentException.class, () ->
        {
            Board board = Board.builder()
                    .content(content)
                    .title(title)
                    .user(user)
                    .build();
        });
        assertThrows(IllegalArgumentException.class, () ->
        {
            Board board = Board.builder()
                    .content(null)
                    .title(title)
                    .user(user)
                    .build();
        });
    }

    @Test
    void 게시판유저없음실패테스트() {
        content = "";

        assertThrows(IllegalArgumentException.class, () ->
        {
            Board board = Board.builder()
                    .content(content)
                    .title(title)
                    .user(user)
                    .build();
        });
        assertThrows(IllegalArgumentException.class, () ->
        {
            Board board = Board.builder()
                    .content(content)
                    .title(title)
                    .user(null)
                    .build();
        });
    }

}

Auditing Test

  • Jpa의 기능인 Auditing을 테스트 합니다.
  • Auditing 세팅을 가져오기 위해서는 JpaConfig를 가져와야 하기 때문에 @DataJpaTest로만은 구현이 어렵습니다.
  • 일단은 @SpringBootTest를 통해 진행 한 뒤 후에 @DataJpaTest에 추가 하는 방식으로 변경하겠습니다.
  • Jpa는 기본적으로 transaction으로 동작합니다.
@SpringBootTest
@Transactional
public class AuditingTest {

    @Autowired
    UserRepository userRepository;

    @Autowired
    BoardRepository boardRepository;

    @Autowired
    CommentRepository commentRepository;

    @Autowired
    EntityManager em;

    @Test
    void 유저_Auditing() {
        User user = User.builder()
                .username("test")
                .email("test@email.com")
                .password("test")
                .build();
        
        User saveUser = userRepository.save(user);
        
        assertThat(saveUser.getCreatedDate()).isNotNull();
        assertThat(saveUser.getModifiedDate()).isNotNull();
    }
    @Test
    void 게시판_Auditing() {
        User user = User.builder()
                .username("test")
                .email("test@email.com")
                .password("test")
                .build();

        Board board = Board.builder()
                .content("test")
                .title("title")
                .user(user)
                .build();
        User saveUser = userRepository.save(user);
        Board saveBoard = boardRepository.save(board);
        assertThat(saveBoard.getCreatedDate()).isNotNull();
        assertThat(saveBoard.getModifiedDate()).isNotNull();
        assertThat(saveBoard.getCreatedBy()).isNotNull();
        assertThat(saveBoard.getUpdatedBy()).isNotNull();

    }

    @Test
    void comment_Auditing() {
        User user = User.builder()
                .username("test")
                .email("test@email.com")
                .password("test")
                .build();

        Board board = Board.builder()
                .content("test")
                .title("title")
                .user(user)
                .build();

        Comment comment = Comment.builder()
                .board(board)
                .user(user)
                .content("test")
                .build();
        User saveUser = userRepository.save(user);
        Board saveBoard = boardRepository.save(board);
        Comment saveComment = commentRepository.save(comment);
        assertThat(saveComment.getCreatedDate()).isNotNull();
        assertThat(saveComment.getModifiedDate()).isNotNull();
        assertThat(saveComment.getCreatedBy()).isNotNull();
        assertThat(saveComment.getUpdatedBy()).isNotNull();

    }

    @Test
    void merge테스트() {
        User user = User.builder()
                .username("test")
                .email("test@email.com")
                .password("test")
                .build();
        Board board = Board.builder()
                .title("test")
                .content("hoiu")
                .user(user)
                .build();
        userRepository.save(user);
        Board saveBoard = boardRepository.save(board);
        em.flush();
        em.clear();


        Board find = boardRepository.findById(saveBoard.getId()).get();
        find.setContent("오잉이잉");
        System.out.println(em.contains(find));

        Board merge = em.merge(find);
        em.flush();
        em.clear();
        System.out.println(em.contains(find));
        find.setContent("오잉");
//        merge.setContent("호로이");

        em.flush();
        em.clear();
    }
}
profile
2년차 백엔드 개발자

0개의 댓글