티스토리 뷰

728x90

1. 아래와 같이 TDD로 테스트하기 어려운 부분을 수정하려고 한다.

package game.core;

public class Car implements Comparable<Car> {
...
    public void move() {
        if (getRandomNo() == FORWORD_NUM){ //random 숫자때문에 TDD로 테스트하기가 어렵다.
            this.position++
        }
    }
    
    private int getRandomNo() {
        Random random = new Random();
        return random.nextInt(MAX_BOUND);
    }
...
}

 

2. 아래와 같이 값을 주입받는 식으로 수정 수 있다

기존 메서드를 오버로딩해서 사용 할 수도 있다. 점차적으로 기존 코드를 삭제해가면서 진행 할 수도 있다.

package game.core;

public class Car implements Comparable<Car> {
...
    public void move(int randomValue) {  //random 값을 입력받는다.
        if (randomValue == FORWORD_NUM){
            this.position++
        }
    }
...
}

하지만 현업에서 기존 코드를 바꿔버리면 컴파일 에러가 많이 발생하고, 사이드이팩트가 많을 수 있기 때문에 이렇게 리팩토링하는 것은 좋지 않다.

기존 코드(메서드 시그니처)를 최대한 건들지 않고 테스트 가능한 구조로 바꾸기 위해서 아래와 같이 가능하다.

 

3. getRandomNo 메서드 접근제어자를 protected로 수정한다. (메서드 시그니처는 바꾸지 않았지만 random number를 변경 할 수 있는 구조가 되었다.)

package game.core;

public class Car implements Comparable<Car> {
...
    public void move() {
        if (getRandomNo() == FORWORD_NUM){ //random 숫자때문에 TDD로 테스트하기가 어렵다.
            this.position++
        }
    }
    
    protected int getRandomNo() {
        Random random = new Random();
        return random.nextInt(MAX_BOUND);
    }
...
}
    @Test
    @DisplayName("자동차 경기 상태 확인_전진")
    void checkStatusOfMovingCar_ShouldBeForward() {
        //오버라디딩하여 랜덤값을 입력해준다. (테스트 가능해짐)
        Car car = new Car(new CarName("myCar")){
            @Override
            protected int getRandomNo() {
                return 4;
            }
        };
    }

 

 

728x90

'JAVA' 카테고리의 다른 글

String.valueOf() vs. Object.toString()  (0) 2022.04.02
정규식  (0) 2022.04.02
Clean Code 정리 링크  (0) 2021.05.25
private static final에 대해서  (0) 2021.05.25
원시값, 문자열 포장  (0) 2021.05.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30