본문 바로가기
Spring Framework/TDD

JpaAuditing이 Test할 때 적용이 안되는 경우

by 도쿠니 2022. 6. 12.

오류

  • 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

댓글