작성
·
189
0
안녕하세요 junit으로 테스트 코드를 작성하던 중 질문사항이 생겨 글 남깁니다.
[상황]
private void setData(){
// A는 BaseEntity를 상속 받고 있으며 그안에는 createdAt()이 있습니다.
A a1 = A.builder()
....
.build();
em.persist(a1);
,,,
em.persist(a2);
,,,
em.persist(a3);
,,,
em.persist(a4);
}
@Test
void test1(){
//Given
setData();
//When
// a1,a2,a3,a4 에 대해 createdAt()으로 내림차순 정렬합니다.
}
이때 제가 동작하였을 때는 문제가 없었는데 팀원 분이 실행했을 때 에러가 발생했습니다.
아래 그림과 같이 nana4,5 가 createdAt이 같은 시간으로 등록되었고 이 부분에서 정렬하는데 문제가 발생하였습니다.
질문 1.
저의 작업환경에서는 이런 상황이 발생하지 않고 항상 1~5까지의 nana가 다른 creatdAt시간을 갖고 있었습니다. 하지만 다른 팀원의 작업 환경에서는 동시간으로 입력되는 상황이 발생하였는데 이는 컴퓨터의 성능 차이일까요?
질문 2.
해결을하기 위해서 검색을 해보다가 em.persist()다음에 Thread.sleep()을 작성하는 방법을 찾았으나 옳은 방법인지 고민이 되고있습니다. 더 적합한 해결책이 있을지 궁금합니다
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
질문 1에 대한 답변입니다.
네, it’s 가능성이 높습니다. 단순히 컴퓨터의 처리 속도 차이로 인해, 같은 시간에 여러 데이터의 생성 시간이 기록되는 경우가 발생할 수 있습니다. 데이터베이스에 데이터를 빠르게 연속적으로 삽입할 때, 특히 단위 테스트 환경에서는 이러한 현상이 자주 관찰될 수 있습니다.
질문 2에 대한 답변입니다.
Thread.sleep()
을 사용하는 방법은 테스트의 실행 시간을 불필요하게 늘리고, 실제 환경을 반영하지 않는 인위적인 방식이기 때문에 권장되지 않습니다. 테스트 환경에서는 보통 시간을 조작할 수 있는 도구를 사용하여 시간에 의존하는 로직을 테스트합니다. 예를 들어, @DataJpaTest
를 사용하여 JPA 관련 테스트를 진행하는 경우, TestEntityManager
를 사용하여 Entity를 관리할 수 있습니다. 여기에서는 createdAt
과 같은 시간 필드를 직접 조작하여 테스트 데이터를 준비할 수 있습니다. 또는, 테스트 실행 시 시간을 반환하는 컴포넌트를 Mocking하여, 원하는 시간을 반환하게 하여 테스트가 예측 가능한 결과를 내도록 하는 것이 좋습니다.
해당 정보는 제공된 링크에서 더 자세히 확인할 수 있습니다.
스프링 부트 문서 참조