@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