해결된 질문
작성
·
540
0
안녕하세요.
회원 탈퇴 기능을 개발하고 있습니다.
탈퇴하면 Users 테이블의 use_yn 값을 N 변경 후
14일 지나면 스케줄러로 관련 데이터를 다 지우도록 개발하려고 합니다.
스케줄러 작업 중에 있는데
테스트코드를 짜다가 막혀서요.
탈퇴 누를 때 use_yn 값을 변경하기 때문에
BaseEntity에 있는 upd_date가 알아서 변경일을 update 합니다.
근데 그래서 테스트 코드에서 upd_date 조작을 할 수가 없네요 ㅠㅠ
14일 지난 케이스로 만들어보려고 합니다.
스케줄러라 스케줄러에 파라미터를 보낼 수도 없고
이 경우에는 어떻게 테스트 하나요?
답변 2
1
안녕하세요, ILoveBackEnd님! :)
일단 스케줄러가 어떤 형태의 스케줄러인지, 작성하신 프로덕션 코드와 테스트 코드가 어떤 형태인지 코드를 올려주시지 않아서.. 😅 문제 상황을 추측해서 답변 드려보겠습니다.
(제가 강의 중에 작성한 코드에 대한 질문이 아니라면 다음부터는 코드 기반으로 상세하게 질문 주시면 좋을 것 같습니다. ☺️)
제가 이해한 상황은, BaseEntity에서 JPA Auditing되는 컬럼(upd_date)을 통해 비즈니스 로직을 전개하신 것 같은데, 테스트 코드의 fixture를 만들다보니 해당 컬럼을 조작하기가 어려워서 질문 주신 것으로 이해했습니다.
방법은 크게 2가지로 생각이 드는데요.
탈퇴한 시점을 판단하는 컬럼을 upd_date 컬럼 대신 별도의 컬럼(ex. withdrawal_date)을 두고 판단하도록 한다.
테스트에서 ReflectionTestUtils를 활용해서 해당 컬럼을 조작해 본다.
저는 2번 보다는 1번을 택할 것 같은데요, 14일 전에 탈퇴한 회원을 upd_date로 확인한다면 생각지 못한 곳에서 문제가 될 것 같기 때문입니다.
Auditing으로 변경되는 컬럼은 보통 참조성으로만 두는 것이 좋은데, use_yn 값을 변경했을 때 upd_date가 변경되지만, 다른 컬럼이 변경되었을 때도 upd_date가 변경되기 때문입니다.
즉, upd_date 컬럼은 use_yn 컬럼만을 위한 컬럼이 아니기 때문에 현재 구현하신 방법에서는 후에 User 엔티티가 더 발전한다면 말씀드린 문제가 생길 것 같아요. ㅎㅎ
도움이 되셨기를 바랍니다.
감사합니다. :)
0
안녕하세요, 인프런 AI 인턴이에요. BaseEntity에 있는 upd_date를 조작해서 테스트해보려는데 어려움을 겪고 계시군요.
BaseEntity 클래스는 엔티티들의 공통 필드를 정의하는 클래스로 보통 일반적인 값을 가지고 있습니다. 테스트 코드에서 BaseEntity의 값을 조작하는 것은 어려운 일이므로, 다른 방법으로 접근해보시는 것이 좋을 것 같습니다.
하나의 아이디어는 엔티티를 생성한 후에, 업데이트 시각을 직접 설정하는 방법입니다. 이렇게 하면 테스트 코드에서 임의의 시각값을 넣어 개발하려는 시나리오를 테스트할 수 있을 것입니다. BaseEntity에서 upd_date 필드를 설정하는 메서드가 있지 않다면, 직접 메서드를 추가하셔도 됩니다.
다른 아이디어로는, BaseEntity를 상속받은 엔티티를 테스트할 때는 BaseEntity를 직접 사용하지 않고, 변경이 필요한 상황에서는 BaseEntity를 상속받은 MockEntity 클래스를 만들어서 사용하는 방법입니다. MockEntity 클래스에서 upd_date 값을 직접 설정하는 메서드를 추가하여 테스트하면 되겠죠.
이렇게 하면 BaseEntity에서의 변경 없이도 원하는 테스트 시나리오를 구현할 수 있습니다. 해당 방법들 중에 하나를 선택해서 사용해보세요. 문제 없는 개발을 하시길 바래요. 좋은 결과 있으시길 바랄게요. 이제 다른 내용이 있으신가요?