바우처 과제를 하면서 테스트 때문에 눈물나는 일이 많다.
동료들도 그렇고 멘토님도 그렇고 테스트에 대해서 많은 관심을 가지고 시행착오를 겪는 모양이다.
동료 중에 테스트 코드 작성하기 전에 보면 좋을 것 같다고 공유한 블로그가 있다.
잘 정리해서 알차게 써먹고 싶어서 요약정리하려고 한다.
좋은 글 많으니 자주 가보면 좋을 것 같다.
향로 블로그 - 테스트하기 좋은 코드 - 테스트하기 어려운 코드
정진욱 블로그 - Testing, Oh my!
@SpyBean
, @MockBean
을 쓰지 않도록 하는 것도 좋은 방법class Order {
private long amount;
void discount() {
var now = LocalDateTime.now();
if (now.dayOfWeek() == DayOfWeek.SUNDAY) {
this.amount = amount * 0.9;
}
}
}
// domain logic
void discountWith(LocalDateTime now) {
if (now.dayOfWeek() == DayOfWeek.SUNDAY) {
this.amount = amount*0.9;
}
}
// using domain logic
var sut = new Order(100);
var now = LocalDateTime.of(2023,8,14,10,15,0);
sut.discountWith(now);
// 제어할 수 없는 값 반환 인터페이스
interface Time {
LocalDateTime now();
}
// 메인코드에서 활용
class SeoulTime implements Time {
@Override
public LocalDateTime now() {
return LocalDateTime.now();
}
}
// 테스트코드에서 활용
class StubTime implements Time {
private LocalDateTime currentTime;
public StubTime(Number year, Number month, Number day, Number hour, ...) {
currentTime = LocalDateTime.of(....);
}
@Override
public LocalDateTime now() {
return this.currentTime;
}
}