본문 바로가기
개발/Spring

JPA 테스트

by BellOne4222 2024. 2. 27.

@DataJpaTest

  • persistence layer를 슬라이스 테스트 하기 위한 각종 자동 설정을 지원
  • 복잡한 쿼리 표현을 테스트
  • TestEntityManager : 테스트 데이터를 주입할 EntityManager를 사용 가능
  • @AutoConfigureTestDatabase : 테스트용 인메모리 DB를 다른 환경으로 바꿀 때 사용
  • @JdbcTest : Spring Data 기능 없이 DataSource만 테스트
  • @DataJdbcTest : DataSource + Spring Data JDBC 

 

 

@DisplayName("DB - 이벤트")
@DataJpaTest
class EventRepositoryTest {

	private final EventRepository eventRepository;

	// EventRepositoryTest 생성자
	public EventRepositoryTest(@Autowired EventRepository eventRepository) {
		this.eventRepository = eventRepository;
	}

	// 이벤트 뷰 데이터를 검색 파라미터와 함께 조회하면, 조건에 맞는 데이터를 페이징 처리하여 리턴한다.
	@DisplayName("이벤트 뷰 데이터를 검색 파라미터와 함께 조회하면, 조건에 맞는 데이터를 페이징 처리하여 리턴한다.")
	@Test
	void givenSearchParams_whenFindingEventViewPage_thenReturnsEventViewResponsePage() {
		// Given

		// When
		Page<EventViewResponse> eventPage = eventRepository.findEventViewPageBySearchParams(
			"배드민턴",
			"운동1",
			EventStatus.OPENED,
			LocalDateTime.of(2021, 1, 1, 0, 0, 0),
			LocalDateTime.of(2021, 1, 2, 0, 0, 0),
			PageRequest.of(0, 5)
		);

		// Then
		assertThat(eventPage.getTotalPages()).isEqualTo(1);
		assertThat(eventPage.getNumberOfElements()).isEqualTo(1);
		assertThat(eventPage.getTotalElements()).isEqualTo(1);
		assertThat(eventPage.getContent().get(0))
			.hasFieldOrPropertyWithValue("placeName", "서울 배드민턴장")
			.hasFieldOrPropertyWithValue("eventName", "운동1")
			.hasFieldOrPropertyWithValue("eventStatus", EventStatus.OPENED)
			.hasFieldOrPropertyWithValue("eventStartDatetime", LocalDateTime.of(2021, 1, 1, 9, 0, 0))
			.hasFieldOrPropertyWithValue("eventEndDatetime", LocalDateTime.of(2021, 1, 1, 12, 0, 0));
	}

	// 이벤트 뷰 데이터 검색어에 따른 조회 결과가 없으면, 빈 데이터를 페이징 정보와 함께 리턴한다.
	@DisplayName("이벤트 뷰 데이터 검색어에 따른 조회 결과가 없으면, 빈 데이터를 페이징 정보와 함께 리턴한다.")
	@Test
	void givenSearchParams_whenFindingNonexistentEventViewPage_thenReturnsEmptyEventViewResponsePage() {
		// Given

		// When
		Page<EventViewResponse> eventPage = eventRepository.findEventViewPageBySearchParams(
			"없은 장소",
			"없는 이벤트",
			null,
			LocalDateTime.of(1000, 1, 1, 1, 1, 1),
			LocalDateTime.of(1000, 1, 1, 1, 1, 0),
			PageRequest.of(0, 5)
		);

		// Then
		assertThat(eventPage).hasSize(0);
	}

	// 이벤트 뷰 데이터를 검색 파라미터 없이 페이징 값만 주고 조회하면, 전체 데이터를 페이징 처리하여 리턴한다.
	@DisplayName("이벤트 뷰 데이터를 검색 파라미터 없이 페이징 값만 주고 조회하면, 전체 데이터를 페이징 처리하여 리턴한다.")
	@Test
	void givenPagingInfoOnly_whenFindingEventViewPage_thenReturnsEventViewResponsePage() {
		// Given

		// When
		Page<EventViewResponse> eventPage = eventRepository.findEventViewPageBySearchParams(
			null,
			null,
			null,
			null,
			null,
			PageRequest.of(0, 5)
		);

		// Then
		assertThat(eventPage).hasSize(5);
	}

	// 이벤트 뷰 데이터를 페이징 정보 없이 조회하면, 에러를 리턴한다.
	@DisplayName("이벤트 뷰 데이터를 페이징 정보 없이 조회하면, 에러를 리턴한다.")
	@Test
	void givenNothing_whenFindingEventViewPage_thenThrowsError() {
		// Given

		// When
		Throwable t = catchThrowable(() -> eventRepository.findEventViewPageBySearchParams(
			null,
			null,
			null,
			null,
			null,
			null
		));

		// Then
		assertThat(t).isInstanceOf(InvalidDataAccessApiUsageException.class);
	}
}

'개발 > Spring' 카테고리의 다른 글

Spring Security  (0) 2024.02.27
Querydsl  (1) 2024.02.27
DataSource, TransactionManager  (1) 2024.02.27
Spring Data JPA 인터페이스  (0) 2024.02.27
H2 Database  (0) 2024.02.26