나는 Repository클래스의 테스트 클래스를 만들고 테스트를 진행하려고한다.

1. 내가 테스트하려는 BoardReposity 그중 save메소드
package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; //임포트는 알트 + enter @Repository //@Repository를 붙이면 스프링이 new를 해서 Ioc(컬렉션 List 자료형 같은거) 에 저장한다. public class BoardRepository { @Autowired//Ioc에 있는 객체를 찾아온다. private EntityManager em; public BoardRepository() { System.out.println("BoardRepository 생성자"); } //insert 하기 @Transactional // db의 변경요청시에는 해줘야하한다.(변경중이니까 건들지 말라고 건다) public void save(String title, String content) { System.out.println("리파지토리로오나?"); Query query = em.createNativeQuery("insert into post_tb(subtitle, post_content, created_at) values (?,?,now())"); query.setParameter(1, title); query.setParameter(2, content); query.executeUpdate(); } }
2.테스트

전체를 다 테스트를 할 필요가 없기에 내가 테스트를 하려고하는 db부분만을 테스트를 진행하였다.
테스트폴더에 테스트하려고하는 리포지토리와 같게 폴더를 board로 만들고 BoardRepositoryTest로 테스트 클래스를 만들었다.
보통은 이렇게 테스트하려고하는 클래스 이름의 뒤에 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; //@SpringBootTest //C R E H2 -> 모든 레이어를 메모리에 다 올리고 테스트할 때 사용하는 어노테이션 @DataJpaTest // h2, em @Import(BoardRepository.class)//br public class BoardRepositoryTest {//컨벤션Test @Autowired private BoardRepository boardRepository; //테스트 메서드에서는 매개변수를 사용할 수 없다. // 메서드명_test : 컨벤션 @Test public void save_test() { //test의 단계 //given(매개변수를 강제로 만들기) String title = "제목1"; String content = "내용1"; //when(테스트) boardRepository.save(title, content); //eye(눈으로 확인) } }
@Test라는 어노테이션을 테스트하려고하는 메소드위에 붙이고
3가지 순으로 진행한다.
1.given(매개변수를 강제로만들기)
클라이언트에서 컨트롤러로 넘어와 리지파지토리로 전송되는 데이터를 강제로 만들었다.
2.when(실질적인 테스트)
테스트하려고하는 클래스를 의존성주입을 통하여 가져오고 여기서 테스트하려고하는 메소드를 테스트 해본다.
3.eye(콘솔확인)
콘솔을 통하여 테스트가 어떻게 동작하는지 분석하고 이를 활용해서 추후 문제가 발생한다면 테스트 코드를 활용해서 문제가되는 부분을 빠르게 찾을 수 있다.
3.틀린값을 넣어서 테스트해보기
String title = "제목1"; 에 null을 넣어도 정상적으로 돌아간다.
돌아가면 안되기에 board
Entity
에 @Column(nullable = false) private String title;
이걸추가해주면 정상적으로 에러가 발생한다.
또한
//보통은 테이블명 뒤에 _tb를 붙인다. @Entity // DB에서 조회하면 자동 매핑이됨 public class Board { @GeneratedValue(strategy = GenerationType.IDENTITY) //Auto_increment설정, 시퀀스 설정 @Id //PK private Integer id; @Column(nullable = false) private String title; @Column(nullable = false) private String content;
테이블명을 바꾼다던가 title이나 content의 이름을 의도적으로 틀리게 적어도 에러가 발생하는 것을 확인 할 수 있다.
Share article