오류
- Spring Data Jpa가 생성해주는 메소드들이 내가 원하는 데이터를 정확히 가져오는지 테스트해보고자 코드를 작성해보았는데 오류가 발생했습니다.
작성 코드
@DataJpaTest
class AccountRepositoryTest {
@Autowired
private AccountRepository accountRepository;
@Autowired
private AccountUserRepository accountUserRepository;
private static AccountUseraccountUser;
private static Accountaccount;
@BeforeAll
static void init() {
accountUser= AccountUser.builder()
.name("test")
.build();
account= Account.builder()
.accountUser(accountUser)
.accountStatus(AccountStatus.IN_USE)
.accountNumber("1234567891")
.balance(1000L)
.build();
}
@Test
@DisplayName("중복된 계좌번호가 있을 경우")
void existsAccountByAccountNumber() {
//given
accountUserRepository.save(accountUser);
accountRepository.save(account);
//when
booleanresult=
accountRepository.existsAccountByAccountNumber("1234567891");
//then
assertTrue(result);
}
}
오류 모습
- INSERT 쿼리에서 null 제약조건을 위배한다고 합니다.
오류 분석
- Null 제약조건이 걸린 컬럼들을 확인해보았는데 그게 created_At, updated_At이였습니다.
- 이 컬럼들은 JpaAuditing 기능으로 자동적으로 값을 넣어주던 컬럼들인데 값이 안들어가는거보니 테스트 시에는 생성을 안해주는 것 같습니다.
오류 발생 원인
- @DataJpaTest 는 JpaTest에 필요한 최소한의 빈만을 불러오는데, 거기에는 @Configuration 빈이 포함되어있지않습니다.
- 이로 인해, @Configuration을 사용하여 따로 JpaConfig 파일을 만들었을 경우에 @DataJpaTest가 불러오지 못합니다.
해결 방법
- @DataJpaTest가 @Configuration 빈을 포함하도록 해줍니다.
- @Import 로 설정 빈을 불러옵니다.
@Import(JpaAuditingConfig.class)
@DataJpaTest
class AccountRepositoryTest {
@Autowired
private AccountRepository accountRepository;
@Autowired
private AccountUserRepository accountUserRepository;
private static AccountUseraccountUser;
private static Accountaccount;
@BeforeAll
static void init() {
accountUser= AccountUser.builder()
.name("test")
.build();
account= Account.builder()
.accountUser(accountUser)
.accountStatus(AccountStatus.IN_USE)
.accountNumber("1234567891")
.balance(1000L)
.build();
}
@Test
@DisplayName("중복된 계좌번호가 있을 경우")
void existsAccountByAccountNumber() {
//given
accountUserRepository.save(accountUser);
accountRepository.save(account);
//when
booleanresult=
accountRepository.existsAccountByAccountNumber("1234567891");
//then
assertTrue(result);
}
}
P.S.
- @SpringBootApplication 이 붙은 곳에 @JpaAuditing 을 달아주어도 해결된다고 합니다.
- 그런데 config를 따로 분리해서 사용하는 목적이 있기 때문에 그 목적을 위해서라도 분리해서 사용하는 것이 좋을 것 같습니다.
- @SpringBootApplication에 붙이는 것은 추천하지 않는 방법이라고 합니다.
출처
'Spring Framework > TDD' 카테고리의 다른 글
단위 테스트 (Unit Test) (0) | 2022.06.21 |
---|---|
Mockito (0) | 2022.06.21 |
Junit, Mockito 를 이용한 테스트 (0) | 2022.06.11 |
댓글