프로젝트 레포지토리 테스트.

c.Hano·2025년 2월 27일

프로그래머스

목록 보기
5/5
post-thumbnail

개발용, 테스트용 yml파일을 설정하였다.

해당 레포지터리가 엔티티와 연결되어 잘 작동하는지 확인해보자.

테스트 파일에 직접 파일을 작성해도 되지만 인텔리J에서 제공하는 단축키인 커멘드+shift+T 를 사용하여 테스트 파일을 생성하였다.


테스트해볼 기능은 다음과 같다.


1. 엔티티에 데이터를 넣었을 때 값이 저장이 되는지.
2. findByName 메서드가 작동을 하는지.

package reproject.calendars.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;
import reproject.calendars.entity.Calendar;

import java.util.Optional;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest 
-> 해당 에너테이션이 있을 시 테스트 실행 시 스프링에 모든 bean이 실행된다.

@ActiveProfiles("test") 
-> application-{profiles}.yml 에서 "" 안의 값을 profiles로 읽는다.
	application-test.yml을 실행하도록 설정한다.

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
-> 스프링은 기본 실행시 데이터베이스를 embedded모드로 실행시키려한다. 해당 기능을 NONE을 통해 방지하여 
	application-test.yml에 있는 mem모드로 강제로 실행시킨다.
    
@Transactional
-> 테스트 메서드 하나 실행 시 데이터를 초기화시켜준다.

class CalendarRepositoryTest {

    @Autowired
    private CalendarRepository calendarRepository;

    @Test
    void 캘린더_엔티티_생성() {
        //GIVEN
        Calendar calendar = new Calendar("test", "test");

        //WHEN
        Calendar saveCalendar = calendarRepository.save(calendar);

        //THEN
        assertNotNull(saveCalendar.getId());
        assertEquals("test", saveCalendar.getName());
    }

    @Test
    void findByName_테스트() {
        //GIVEN
        Calendar calendar = new Calendar("test1", "test1");
        calendarRepository.save(calendar);

        //WHEN
        Optional<Calendar> saveCalendar = calendarRepository.findByName("test1");

        //THEN
        assertThat(saveCalendar.isPresent());
        assertThat(saveCalendar.get().getName()).isEqualTo("test1");
        -> Optional로 감싸져 있는 객체는 null값일 수도 있으므로 바로 .getName()을 사용하지 못한다.
        	.get()으로 Optional을 한번 벗겨주고 .getName()을 사용해야한다.
    }
}

실제로 test파일이 application-test.yml에서 mem 모드의 데이터베이스를 사용하고 있는지 확인하고 싶다면 application-test.yml에 해당 코드를 추가하자.

logging:
  level:
    org.springframework: DEBUG  # 스프링 관련 로그를 DEBUG 수준으로 출력
    org.hibernate.SQL: DEBUG  # Hibernate가 실행하는 SQL 쿼리 로그 출력

test파일을 실행 후 터미널 로그에서 test를 확인해보자. 검색이 된다면 잘 연결이 된 것이다.

테스트도 무사 통과하였다!

profile
꼬질이

0개의 댓글