inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Practical Testing: 실용적인 테스트 가이드

BaseEntity 조작이 필요할 때 테스트 코드 작성 방법

해결된 질문

655

ILoveBackEnd

작성한 질문수 12

0

안녕하세요.

 

회원 탈퇴 기능을 개발하고 있습니다.

탈퇴하면 Users 테이블의 use_yn 값을 N 변경 후

14일 지나면 스케줄러로 관련 데이터를 다 지우도록 개발하려고 합니다.

 

스케줄러 작업 중에 있는데

테스트코드를 짜다가 막혀서요.

 

탈퇴 누를 때 use_yn 값을 변경하기 때문에

BaseEntity에 있는 upd_date가 알아서 변경일을 update 합니다.

근데 그래서 테스트 코드에서 upd_date 조작을 할 수가 없네요 ㅠㅠ

14일 지난 케이스로 만들어보려고 합니다.

스케줄러라 스케줄러에 파라미터를 보낼 수도 없고

이 경우에는 어떻게 테스트 하나요?

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 2

1

박우빈

안녕하세요, ILoveBackEnd님! :)

일단 스케줄러가 어떤 형태의 스케줄러인지, 작성하신 프로덕션 코드와 테스트 코드가 어떤 형태인지 코드를 올려주시지 않아서.. 😅 문제 상황을 추측해서 답변 드려보겠습니다.
(제가 강의 중에 작성한 코드에 대한 질문이 아니라면 다음부터는 코드 기반으로 상세하게 질문 주시면 좋을 것 같습니다. ☺️)

제가 이해한 상황은, BaseEntity에서 JPA Auditing되는 컬럼(upd_date)을 통해 비즈니스 로직을 전개하신 것 같은데, 테스트 코드의 fixture를 만들다보니 해당 컬럼을 조작하기가 어려워서 질문 주신 것으로 이해했습니다.

방법은 크게 2가지로 생각이 드는데요.

  1. 탈퇴한 시점을 판단하는 컬럼을 upd_date 컬럼 대신 별도의 컬럼(ex. withdrawal_date)을 두고 판단하도록 한다.

  2. 테스트에서 ReflectionTestUtils를 활용해서 해당 컬럼을 조작해 본다.

저는 2번 보다는 1번을 택할 것 같은데요, 14일 전에 탈퇴한 회원을 upd_date로 확인한다면 생각지 못한 곳에서 문제가 될 것 같기 때문입니다.
Auditing으로 변경되는 컬럼은 보통 참조성으로만 두는 것이 좋은데, use_yn 값을 변경했을 때 upd_date가 변경되지만, 다른 컬럼이 변경되었을 때도 upd_date가 변경되기 때문입니다.
즉, upd_date 컬럼은 use_yn 컬럼만을 위한 컬럼이 아니기 때문에 현재 구현하신 방법에서는 후에 User 엔티티가 더 발전한다면 말씀드린 문제가 생길 것 같아요. ㅎㅎ

도움이 되셨기를 바랍니다.
감사합니다. :)

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요. BaseEntity에 있는 upd_date를 조작해서 테스트해보려는데 어려움을 겪고 계시군요.

BaseEntity 클래스는 엔티티들의 공통 필드를 정의하는 클래스로 보통 일반적인 값을 가지고 있습니다. 테스트 코드에서 BaseEntity의 값을 조작하는 것은 어려운 일이므로, 다른 방법으로 접근해보시는 것이 좋을 것 같습니다.

하나의 아이디어는 엔티티를 생성한 후에, 업데이트 시각을 직접 설정하는 방법입니다. 이렇게 하면 테스트 코드에서 임의의 시각값을 넣어 개발하려는 시나리오를 테스트할 수 있을 것입니다. BaseEntity에서 upd_date 필드를 설정하는 메서드가 있지 않다면, 직접 메서드를 추가하셔도 됩니다.

다른 아이디어로는, BaseEntity를 상속받은 엔티티를 테스트할 때는 BaseEntity를 직접 사용하지 않고, 변경이 필요한 상황에서는 BaseEntity를 상속받은 MockEntity 클래스를 만들어서 사용하는 방법입니다. MockEntity 클래스에서 upd_date 값을 직접 설정하는 메서드를 추가하여 테스트하면 되겠죠.

이렇게 하면 BaseEntity에서의 변경 없이도 원하는 테스트 시나리오를 구현할 수 있습니다. 해당 방법들 중에 하나를 선택해서 사용해보세요. 문제 없는 개발을 하시길 바래요. 좋은 결과 있으시길 바랄게요. 이제 다른 내용이 있으신가요?

private 상수 테스트 관련 질문

0

83

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

126

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

161

2

테스트 문서화 질문입니다

0

105

2

단위테스트 질문이 있습니다

0

96

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

103

2

ERD 가장자리에 있는 도메인 테스트 질문

0

89

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

135

2

OrderCreateRequest DTO에 대해서 궁금한점

0

102

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

156

2

계층 관련 질문이 있습니다.

0

139

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

124

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

135

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

229

2

Service+Repository 통합테스트 관련 질문입니다.

0

150

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

185

2

test 용 .yml

0

90

2

throws Exception

0

80

2

카페키오스크 클래스 문의 ,,

0

89

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

174

2

테스트 코드에서 필요한 생성자

0

138

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

136

2

@DisplayName gradle / intellJ

0

93

2