카테고리 없음

답은 의존성 추상화 - 변하는 값 때문에 테스트 하기가 어렵다!

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());

 

 

아예 추상화를 시키자.