inblog logo
|
codingb
    jUnit

    Test 코드 짜기

    Feb 21, 2024
    Test 코드 짜기

    @Import / @DataJpaTest / @Autowired 어노테이션 사용

    💡
    쿼리 짜고 테스트 하고, 쿼리 짜고 테스트 하고!
     

    insert 메소드 Test 해보기

    [ BoardRepository ]

    package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor @Repository public class BoardRepository { private final EntityManager em; @Transactional public void insert(String title, String content, String author){ Query query = em.createNativeQuery("insert into board_tb(title, content, author) values(?, ?, ?)"); query.setParameter(1, title); query.setParameter(2, content); query.setParameter(3, author); query.executeUpdate(); } }
     

    [ BoardRepositoryTest ]

    notion image
    💡
    main 코드와 패키지를 똑같이 만들고, 클래스는 뒤에 Test라는 컨벤션을 붙여서 생성
    package shop.mtcoding.blog.board; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; @Import(BoardRepository.class) // 내가 만든 클래스는 import 해줘야함! @DataJpaTest // DB 관련 객체들이 IoC에 뜬다. //애를 안 적으면 테스트를 못함 public class BoardRepositoryTest { // Test에서 DI하는 코드 @Autowired //테스트 코드에서는 @Autowired -> @RequiredArgsConstructor 대신 넣는다. private BoardRepository boardRepository; @Test public void insert_test(){ //테스트 메서드는 파라미터, 리턴이 없다. 적는 순간 터짐! // given String title = "제목10"; String content = "내용10"; String author = "이순신"; // when boardRepository.insert(title, content, author); // then -> 눈으로 확인 (쿼리) } // Rollback (자동) }
    notion image
    테스트 코드에서 쿼리 잘 작동하는지 확인 완료
     
     
     
     

    selectOne 메소드 test 해보기

    notion image
    BoardRepositoryTest 에서 코드 작성 했으면 test에서 실행되는지 테스트 해보자
    notion image
    notion image
    테스트 코드에서 쿼리 잘 작동하는지 확인 완료
     

    예외1) null값 넣어보기 (예외 상황 확인하자!)

    notion image
    id = 20 인 게시글은 없으니까 터짐
    notion image
    main코드의 BoardRepository에 가서 try-catch로 묶어줌 (추후에는 catch 부분에 return null이 아니라 throw로 핸들러에 보내줘야겠지?)
     

    [ test 에서… 상태 검사 까지! ]

    notion image
    Assertions.assertThat(board.getTitle()).isEqualTo("제목1"); 상태 검사한다.
     

     
    notion image
    notion image
    💡
    assertThat import 어디인지 확인
     

    SelectAll도 해보자! (* 컬렉션은 try-catch 필요 없음)

    notion image
    💡
    컬렉션을 조회하면 값이 없어도 null이 나오지 않고 [ 0 ]이 나온다. → 모든 DB가 무조건. 빈 컬렉션을 준다. 때문에 컬렉션은 try-catch 할 필요 없음!!
    notion image
    이렇게! try-catch 빼줬다!
    notion image
    notion image
    무슨 값이 들어왔는지 알아야 then을 적겠지 틀린 값(없는 값)을 넣으면 아예 터짐
    @Test public void selectAll_test(){ // given // when List<Board> boardList = boardRepository.selectAll(); System.out.println(boardList.size()); // then (id=1, title=제목1, content=내용1, author=홍길동) // System.out.println(boardList); Assertions.assertThat(boardList.get(0).getTitle()).isEqualTo("제목1"); Assertions.assertThat(boardList.get(0).getContent()).isEqualTo("내용1"); Assertions.assertThat(boardList.get(0).getAuthor()).isEqualTo("홍길동"); Assertions.assertThat(boardList.size()).isEqualTo(8); }
    notion image
    쿼리 정상 작동
     

    update 해보자!

    @Transactional public void update(String title, String content, int id) { Query query = em.createNativeQuery("update board_tb set title = ?, content = ? where id = ?"); query.setParameter(1, title); query.setParameter(2, content); query.setParameter(3, id); query.executeUpdate(); }
     

     
    @Test public void update_test() { // given String title = "제목이다!!"; String content = "내용이다!!"; int id = 1; // when boardRepository.update(title, content, id); // then 상태검사 Board board = boardRepository.selectOne(id); // 눈으로 상태검사 System.out.println(board); //jUnit이 상태검사 Assertions.assertThat(board.getTitle()).isEqualTo("제목이다!!"); Assertions.assertThat(board.getContent()).isEqualTo("내용이다!!"); }
    notion image
     

    [ 틀린 값을 넣으면? ]

    notion image
    업데이트 된 제목이 맞는지 jUnit에서 검사하고, (//then에서 Assertions 코드) 데이터가 틀리면 이렇게 에러가 뜬다!
     

    delete 해보자!

    @Transactional public void delete(int id) { Query query = em.createNativeQuery("delete from board_tb where id = ?"); query.setParameter(1, id); query.executeUpdate(); }
     

     
    @Test public void delete_test() { // given int id = 4; // when boardRepository.delete(id); // then 상태검사 List<Board> boardList = boardRepository.selectAll(); Assertions.assertThat(boardList.size()).isEqualTo(7); System.out.println(boardList.size()); }
    notion image
    정상 실행 완료!
     
    Share article

    codingb

    RSS·Powered by Inblog