DataJpaTest에서 생성일이 null로 조회될 때
생성일만 비어 있었습니다
Question에 생성·수정 시각을 담는 AuditEntity를 포함했습니다. 빌더로 질문을 만들 때 AuditEntity도 함께 생성하도록 해 두었습니다. 아래는 당시 필요한 부분만 발췌한 코드입니다.
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EntityListeners(AuditingEntityListener.class)
public class Question {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//...
@Embedded
private AuditEntity auditEntity;
//...
@Builder
public Question(
//..
)
//...
this.auditEntity = new AuditEntity();
}
}AuditEntity는 생성일과 수정일을 기록하는 값 객체입니다.
@Getter
@Embeddable
public class AuditEntity {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
private LocalDateTime updatedAt;
}@DataJpaTest를 사용하는 저장소 테스트에서 데이터를 미리 저장한 뒤 검색 결과를 임시로 출력해 보다가 생성일이 비어 있는 걸 발견했습니다.
@Test
@DisplayName("작성자 MBTI 검색을 통해 성공한다.")
void success_SendMbtiCondition() {
//given
QuestionSearchParam param = QuestionSearchParam.builder()
.sendMbti("ENTP")
.build();
//when
Page<QuestionResponse> questionResponses = questionRepository.searchWithCondition(pageRequest, param);
// 테스트를 위해 출력해본 상황
for (QuestionResponse questionResponse : questionResponses.getContent()) {
System.out.println("questionResponse.createdAt() = " + questionResponse.createdAt());
}
//then
assertThat(questionResponses.getContent().size()).isEqualTo(3);
}questionResponse.createdAt() = null객체 생성과 Auditing 설정을 나눠 봤습니다
먼저 @EntityListeners(AuditingEntityListener.class)와 @Embedded를 의심했습니다. 값 객체가 생성되지 않은 것인지, 생성은 됐지만 Auditing이 적용되지 않은 것인지 확인할 필요가 있었습니다.
AuditEntity는 언제 생성될까요? 빌더에서 만들고 있다면 객체는 생겼을 테니 JPA Auditing이 적용되지 않은 문제일 수 있었습니다. 그렇다면 테스트에서는 Auditing을 어떻게 활성화해야 할까요?
설정 클래스를 테스트에 가져왔습니다
프로젝트에는 다음 설정이 있었습니다.
@Configuration
@EnableJpaAuditing
public class JpaConfig {
}이 설정을 Auditing이 필요한 테스트에 명시적으로 가져왔습니다.
@Import(JpaConfig.class)
class test클래스명{
//...
}그 뒤로는 출력에 생성일이 찍혀 나왔습니다.
questionResponse.createdAt() = 2023-11-13T17:11:40.102776이 사례에서는 엔티티나 빌더는 그대로 두고 테스트가 사용하는 컨텍스트에 Auditing 설정만 넣어서 해결했습니다.