inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

@DataJpaTest에서 참조하는 Entity 관련 질문 있습니다

미해결

개발자 선배님들 안녕하세요. @DataJpaTest 관련해서 궁금한점이 생겨서 질문드립니다. 제가 작성한 User Entity에서 Address Entity를 FK로 참조하고 있습니다. 여기서 UserRepository의 테스트 코드를 작성할 때 AddressRepository도 @Autowired로 등록 후 Address를 먼저 save()로 insert 후에 User Insert 테스트를 작성해야 하나요??? 이러면 UserRepository의 테스트가 아니라 UserRepository, AddressRepository 두개의 테스트를 작성하는 것이라 좀 이상하다고 생각이 드네요.. 제가 작성한 코드입니다. package com.kh.bookfinder.repository; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.kh.bookfinder.entity.Address; import com.kh.bookfinder.entity.User; import com.kh.bookfinder.entity.UserStatus; import jakarta.persistence.EntityManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; 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.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; @ActiveProfiles("test") @DataJpaTest @TestPropertySource(locations = "classpath:application-test.properties") @AutoConfigureTestDatabase(replace = Replace.NONE) public class UserRepositoryTest { @Autowired UserRepository userRepository; @Autowired AddressRepository addressRepository; Address givenAddress; @BeforeEach public void setup() { givenAddress = Address.builder() .si("서울특별시") .gu("강남구") .dong("역삼동") .roadFullAddress("역삼역") .build(); addressRepository.save(givenAddress); } @Test public void userInsertTest1() { // Given: User가 주어진다. User givenUser = User.builder() .email("user@mail.kr") .password("password") .phone("010-1234-5678") .nickname("nickname") .status(UserStatus.ADMIN) .address(givenAddress) .build(); // When: save() 메서드를 호출하여 User를 저장한다. User actual = this.userRepository.save(givenUser); // Then: actual은 givenUser와 같다. assertThat(actual).isNotNull(); assertThat(actual).isEqualTo(givenUser); } @Test @DisplayName("email은 unique로 중복이 불가능하다") public void userInsertTest2() { // Given: email이 같은 User가 2개 주어진다. User givenUser1 = User.builder() .email("user@mail.kr") .password("password") .phone("010-1234-5678") .nickname("nickname") .status(UserStatus.ADMIN) .address(givenAddress) .build(); User givenUser2 = User.builder() .email("user@mail.kr") .password("password2") .phone("010-5678-1234") .nickname("nickname2") .status(UserStatus.ADMIN) .address(givenAddress) .build(); // When: save() 메서드를 호출하여 givenUser1를 저장한다. User actual = this.userRepository.save(givenUser1); // And: save() 메서드를 호출하여 givenUser2를 저장한다. // Then: Exception이 발생한다. assertThatThrownBy(() -> this.userRepository.save(givenUser2)) .isInstanceOf(DataIntegrityViolationException.class) .hasMessageContaining("Duplicate"); } @Test @DisplayName("nickname은 unique로 중복이 불가능하다") public void userInsertTest3() { // Given: email이 같은 User가 2개 주어진다. User givenUser1 = User.builder() .email("user@mail.kr") .password("password") .phone("010-1234-5678") .nickname("nickname") .status(UserStatus.ADMIN) .address(givenAddress) .build(); User givenUser2 = User.builder() .email("user2@mail.kr") .password("password2") .phone("010-5678-1234") .nickname("nickname") .status(UserStatus.ADMIN) .address(givenAddress) .build(); // When: save() 메서드를 호출하여 givenUser1를 저장한다. User actual = this.userRepository.save(givenUser1); // And: save() 메서드를 호출하여 givenUser2를 저장한다. // Then: Exception이 발생한다. assertThatThrownBy(() -> this.userRepository.save(givenUser2)) .isInstanceOf(DataIntegrityViolationException.class) .hasMessageContaining("Duplicate"); } } 읽어주셔서 감사합니다..!

  • datajpatest
  • springboot
  • jpa
  • java
  • test
이진호 댓글 1 좋아요 0 조회수 149

인기 태그

인프런 TOP Writers

주간 인기글