카테고리 없음
답은 의존성 추상화 - 변하는 값 때문에 테스트 하기가 어렵다!
qwertyv
2024. 8. 21. 13:35
쿠폰을 발급하거나, 사용자에게 지급하면
발급시간과 지급시간에 LocalDateTime.now() 를 이용해 현재시간을 기록하도록 했다.
문제는 테스트코드를 작성하던 중
기대하는 발급시간과 실제 발급시간을 비교해서 테스트를 진행하는데
assertEquals(LocalDateTime.now(), coupon.getReceivedAt());
당연히 틀릴 수 밖에 없는 코드가 되는 것이다.
Expected :2024-08-15T20:36:34.892614
Actual :2024-08-15T20:36:34.890995
우선 기존 코드를 보면
public class CouponService {
public void giveCouponToMember(GiveUserCouponRequest giveUserCouponRequest) {
coupon.assignToMember(member.getId());
}
}
public class Coupon {
public void assignToMember(Long memberId) {
this.memberId = memberId;
this.receivedAt = LocalDateTime.now();
}
}
서비스에서는 쿠폰을 지급하는 코드가 시간을 의존하는지 전혀 알 수 없다.
그렇다면 시간은 주입받아볼까?
public class CouponService {
public void giveCouponToMember(GiveUserCouponRequest giveUserCouponRequest) {
coupon.assignToMember(member.getId(), LocalDateTime.now());
}
}
public class Coupon {
public void assignToMember(Long memberId, LocalDateTime noew) {
this.memberId = memberId;
this.receivedAt = now;
}
}
이제 서비스에서 보아도 시간을 의존한다는 것을 알 수 있다.
음.. 그렇지만 이거 컨트롤러에서 보면 똑같이 시간을 의존하는지가 알 수없다.
게다가 원래 발생했던 테스트 문제가 해결되지 않았다.
assertEquals(LocalDateTime.now(), coupon.getReceivedAt());
아예 추상화를 시키자.