본문 바로가기

Server Oriented/Spring

JUnit5 JPA DB 테이블 1개 목록/상세/등록/수정/삭제

※ Mybatis mapper 가 설정되어 있으면 참조를 하기 때문에,

세팅된 mapper 가 불필요 하면 disable 방법을 찾아 보는 것도..

JUnit 테스트 하는데 계속 에러가 나서 결국 포기했었는데,

나중에 확인해 보니 mapper 중 하나가 문제를 일으켰던... ㅠ.

 

@Slf4j // lombok.extern.slf4j.*

@SpringBootTest // org.springframework.boot.test.context.*

public class ClassATests{

 

  @Autowired // org.springframework.beans.factory.annotation.*
  ClassARepository caRepository; // interface 이기 때문에 스프링에게 생성을 맡기는게 낫다

 

  //@Test // Test 하지 않을 메소드는 이 부분만 주석처리 하면 실행되지 않는다

  public void test1(){ // JUnit 이 작동하는지 체크하기 위해 세팅

    log.info("\n>>> Hello, world!!"); // "\n>>>" 는 Console 창에서 눈에 쉽게 띄게 하려고 넣은 것

  }

 

  @Test // org.junit.jupiter.api.*

  public void testRegister(){ // 등록

    ClassA ca = new ClassA();

    ...

    ClassA tmp = caRepository.save(ca); // DB 에 @Id 값이 동일한 레코드가 이미 존재하면 update, 아니면 insert

                                                               // 작동하는 방식은 #1 select 하고 #2 insert/update 하여, DB 를 총 2회 호출

  }

 

  @Test

  public void testList(){ // 목록

    Iterable <ClassA> caList = caRepository.findAll(); // java.lang.*

    log.info(caList.toString()); // [ClassA(var1=val1, var2=val2, ...), ClassA(var1=val2, ...), ... ]

    for(ClassA ca : caList){

      log.info(">>>.ca : " +ca); // log.info(ca) 는 에러나고 log.info(ca.toString()) 해 주어야 함

    }

  }

 

  @Test
  public void testRead() {
    Optional<ClassA> cao = caRepository.findById("..."); // java.util.*
    log.info(cao.toString()); // Optional[ClassA(var1=val1, ...)]
    if(cao.isPresent()) { // false 인 경우 toString() 하면 "Optional.empty"

                                     // try ~ catch(Exception e) 인 경우, e.getMessage() 는 "No value present"

                                     // JUnit 이니까 이런 메시지가 나오고, 실제는 Exception 내용이 나옴

                                     // JUnit @Test 시에는 isPresnet() 과정이 불필요하지만

                                     // 테스트 하는 이유가 본래 코드에 사용하기 위한 것이므로..
      ClassA ca = cao.get(); // ClassA(var1=val1, ...)
      log.info(ca.toString());
    }
  }

 

  @Test
  public void testModify() {
    Optional<ClassA> cao = caRepository.findById("..."); // select, DB 1회 호출
    log.info(">>>.cao : " +cao); // 수정 전
    if(cao.isPresent()) {
      ClassA ca = cao.get();
      ca.setGroupName("...");
      caRepository.save(ca); // update, DB 1회 호출. 결국 2회 호출. testRegister 처럼 update 해도 2회 호출
      log.info(">>>.ca: " +ca); // 수정 후
    }
  }


  @Test
  public void testDelete() {
    caRepository.deleteById("..."); // select 한 다음 delete. DB 를 2회 호출
  }


}