@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");
}
} 읽어주셔서 감사합니다..!