❐ Description
이번 과제에서는 랜덤하게 값을 출력하는 유틸성 클래스가 있다.
랜덤 값을 테스트하기 위해선 어떻게 해야할까?
❐ 랜덤 값을 제어할 수 없는 구조
처음에는 랜덤 값 생성을 `getCondition()`에서 진행해주었다. 그리고 상황에 따라서 Condition을 조회하는
테스트 코드를 작성할 때 문제가 발생했다. 상황에 맞게 끔 랜덤 값을 생성해줘야 하는데 이를 내가 제어할 수
없는 것이다.
그래도 정말 말도 안되는 방법으로 테스트를 작성하기는 했다.
- `System.setProperty()` 메소드를 사용해서 테스트할 때만 프로퍼티를 셋팅해준다.
- 프로퍼티를 셋팅할 때 테스트 값을 value로 넣어준다.
그 결과 불필요한 클래스들이 생겨나기 시작했다.
❐ 랜덤 값을 제어할 수 있는 구조
랜덤 값을 제어하기 위해 랜덤 값을 생성해주는 부분을 한 단계 씩 밖으로 밀어냈다.
밀어내기 : MovementCondition → Car → Speed
최종적으로 해당 로직은 Speed 도메인에 위치하게 했다. 왜냐면 Speed 인스턴스를 생성하는 책임은
Speed 도메인이 가지고 있어야 하기 때문이다. 그리고 Car에서는 Speed 도메인으로부터 랜덤 속도를
받아오고, 받아온 값을 바탕으로 Car가 이동할 수 있는 거리를 반환하게 했다.
public class Car {
private final String name;
private final MyProgress myProgress;
//...
public Distance movableDistance() {
Speed randomSpeed = Speed.generateRandomSpeed();
return MovementCondition.getMovableDistanceBy(randomSpeed);
}
}
public class Speed {
private static final int MIN_RANDOM_IDX = 0;
private static final int MAX_RANDOM_IDX = 9;
private final long value;
//...
public static Speed generateRandomSpeed() {
return Speed.from(Randoms.pickNumberInRange(MIN_RANDOM_IDX, MAX_RANDOM_IDX));
}
}
이제 랜덤 속도에 따라 이동할 수 있는 거리를 테스트할 수 있다.
public static Distance getMovableDistanceBy(final Speed speed) {
MovementCondition movementCondition = Arrays.stream(MovementCondition.values())
.filter(condition -> condition.predicate.test(speed, MIN_SPEED))
.findFirst()
.orElse(NONE);
return movementCondition.movalbleDistance;
}
이제 `getMovableDistacneBy( )`메소드에 파라미터로 Speed를 받을 수 있다.
이제 해당 메서드에 대한 제어권을 내가 가지게 됐고, 아래와 같이 Test를 작성할 수 있다.
public class MovementConditionTest {
@Test
@DisplayName("random 값 4 : 앞으로 한 칸 전진")
void moveForward() {
// given
Speed speed = Speed.from(4);
// when
Distance actual = MovementCondition.getMovableDistanceBy(speed);
// then
assertThat(actual.equals(Distance.ONE)).isTrue();
}
}
❐ 회고
물론 Mockkito를 사용해서 stubbing을 하면 이런 고민없이 작업을 했을 것이다.
그랬다면 Car의 속도를 다른 도메인에서 제공해주는 기이한 현상이 일어났을 것이다.
오히려 Mockkito를 사용할 수 없는 환경이였기에 이를 발견할 수 있었다고 생각한다.
'우테코 7기 > 2주차' 카테고리의 다른 글
일급 객체 ,일급 컬렉션, Value Object (0) | 2024.10.30 |
---|---|
[Refactoring] 패키지가 무엇을 제공하는지 전달하자! (0) | 2024.10.27 |
2주차 회고 (0) | 2024.10.27 |
자동차 경주 (0) | 2024.10.21 |