본문 바로가기
Java/Spring Boot

[SpringBoot] Spring Test

by curious week 2024. 12. 25.
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 ...중략
 
 @Test
    void testJpa() {
        List<Question> all = this.questionRepository.findAll();
        assertEquals(2, all.size());

        Question q = all.get(0);
        assertEquals("sbb가 무엇인가요?", q.getSubject());
    }​
// src/test/java/com.mysite.sbb
import java.time.LocalDateTime;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest
class SbbApplicationTests {

    @Autowired
    private QuestionRepository questionRepository;

    @Test
    void testJpa() {        
        Question q1 = new Question();
        q1.setSubject("sbb가 무엇인가요?");
        q1.setContent("sbb에 대해서 알고 싶습니다.");
        q1.setCreateDate(LocalDateTime.now());
        this.questionRepository.save(q1);  // 첫번째 질문 저장

        Question q2 = new Question();
        q2.setSubject("스프링부트 모델 질문입니다.");
        q2.setContent("id는 자동으로 생성되나요?");
        q2.setCreateDate(LocalDateTime.now());
        this.questionRepository.save(q2);  // 두번째 질문 저장
    }
}

@SpringBootTest: 테스트 클래스임을 나타낸다.

@Autowired:  스프링이 객체를 대신 생성하여 주입한다. @Autowired 애너테이션을 해당 변수에 적용하면 스프링 부트가 questionRepository 객체를 자동으로 만들어 주입

@Tests: 메서드가 테스트 메서드임을 나타낸다.

import static org.junit.jupiter.api.Assertions.assertEquals;

// ...중략

    @Test
    void testJpa() {
        List<Question> all = this.questionRepository.findAll();
        assertEquals(2, all.size());

        Question q = all.get(0);
        assertEquals("sbb가 무엇인가요?", q.getSubject());
    }

assertEquals(기대값, 실제값): JUnit의 메서드, 예상한 결과와 실제 결과가 동일한지를 확인

assertTrue(oq.isPresent());

assertTrue(): 괄호 안의 값이 true(참) 인지를 테스트, false를 리턴하면 오류가 발생하고 테스트가 종료

@Transactional: 메서드가 종료될 때까지 DB 세션이 유지

import org.springframework.transaction.annotation.Transactional;

@SpringBootTest
class SbbApplicationTests {

    @Autowired
    private QuestionRepository questionRepository;

//  @Transactional
    @Test
    void testJpa() {
        Optional<Question> oq = this.questionRepository.findById(2);
        assertTrue(oq.isPresent());
        Question q = oq.get();

        List<Answer> answerList = q.getAnswerList();

        assertEquals(1, answerList.size());
        assertEquals("네 자동으로 생성됩니다.", answerList.get(0).getContent());
    }
}

@Transactional 애너테이션이 없다면, findById 메서드를 통해 Question 객체를 조회하고 나면 DB 세션이 끊어지기 때문에 오류가 발생한다.

'Java > Spring Boot' 카테고리의 다른 글

[Spring Boot] email 전송하기  (2) 2025.01.29
[SpringBoot] Thymeleaf  (1) 2024.12.25
[SpringBoot] H2database, JPA 설정과 사용법  (4) 2024.12.22
[SpringBoot] Annotation  (0) 2024.12.22
[SpringBoot] 기본 파일  (2) 2024.12.22