Random 값을 처리하는 코드는 어떻게 단위 테스트할 수 있을까?

2017-10-23 14:06

요구사항은 다음과 같다.

Random 값을 구한 후 Random 값이 4이상인 경우 자동차를 1만큼 증가시킨다.

이 같은 요구사항을 만족하기 위한 구현 코드를 다음과 같이 구현할 수 있다.

public class Car {
	private int position;
	
	[...]

	public void move() {
		if (getRandomNo() >= 4)
			this.position++;
	}

	public int getRandomNo() {
		Random random = new Random();
		return random.nextInt(10);
	}
}

그런데 위와 같이 구현할 경우 move() 메소드에 대한 단위 테스트를 하기 힘들다. 위 코드를 단위 테스트가 가능하도록 리팩토링한다면 어떻게 리팩토링하는 것이 좋을까?

위와 같은 경우는 애플리케이션을 개발하다보면 정말 자주 발생하는 경우 중의 하나이다.

위 샘플 예제는 코드스쿼드 에서 새롭게 진행 중인 마스터즈 코스에서 발췌한 코드입니다. 코드스쿼드의 마스터즈 코스는 코드 리뷰 방식의 개인별 맞춤 학습 방법입니다.

1개의 의견 from FB

1개의 의견 from SLiPP

2017-10-25 11:08

객체를 객체스럽게 사용하도록 리팩토링해라. 글에 테스트 관련 내용이 추가 되어 참고하면 좋겠음.

    @Test
    public void run_random값_3() throws Exception {
        Car car = new Car();
        car.run(createRandom(3));
    }
    
    @Test
    public void run_random값_4() throws Exception {
        Car car = new Car();
        car.run(createRandom(4));
    }
    
    private Random createRandom(int returnValue) {
        return new Random() {
            public int nextInt(int bound) {
                return returnValue;
            };
        };
    }
의견 추가하기

연관태그

← 목록으로