@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 ]

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 (자동) }

테스트 코드에서 쿼리 잘 작동하는지 확인 완료
selectOne 메소드 test 해보기

BoardRepositoryTest 에서 코드 작성 했으면 test에서 실행되는지 테스트 해보자


테스트 코드에서 쿼리 잘 작동하는지 확인 완료
예외1) null값 넣어보기 (예외 상황 확인하자!)

id = 20 인 게시글은 없으니까 터짐

main코드의 BoardRepository에 가서 try-catch로 묶어줌 (추후에는 catch 부분에 return null이 아니라 throw로 핸들러에 보내줘야겠지?)
[ test 에서… 상태 검사 까지! ]

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


assertThat import 어디인지 확인
SelectAll도 해보자! (* 컬렉션은 try-catch 필요 없음)

컬렉션을 조회하면 값이 없어도 null이 나오지 않고 [ 0 ]이 나온다.
→ 모든 DB가 무조건.
빈 컬렉션을 준다. 때문에 컬렉션은 try-catch 할 필요 없음!!

이렇게! try-catch 빼줬다!


무슨 값이 들어왔는지 알아야 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); }

쿼리 정상 작동
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("내용이다!!"); }

[ 틀린 값을 넣으면? ]

업데이트 된 제목이 맞는지 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()); }

정상 실행 완료!
Share article