모든 코드는 여기를 클릭 하시면 확인 하실 수 있습니다.
안녕하세요. 벌써 4탄까지나 쓰게 되었네요...! 이번 포스팅에서는 아래와 같은 기능들을 테스트하고 구현하여 리팩토링하여 출력을 제외한 나머지 부분을 마무리 지을까 합니다. 완성된 예제코드는 모든 포스팅을 마무리 하고 추가로 올리겠습니다.
package kail.study.java.racing.util;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class RandomUtil {
public static final int ENOUGH_BIG_NUMBER = 10000;
@Test
void create() {
for(int i = 0; i< ENOUGH_BIG_NUMBER; i++) {
assertThat(RandomGenerator.create()).isBetween(0,9);
}
}
}
package kail.study.java.racing.util;
import java.util.Random;
public class RandomGenerator {
private static final int BOUND = 10;
public static int create() {
return new Random().nextInt(BOUND);
}
}
create()
매소드가 3이라는 임의의 수를 반환하게 하는 것이 테스트가 통과하는 가장 쉬운 로직이 되겠죠? 이후에 리팩토링을 통해 범용적으로 적용될 수 있는 로직을 작성하고 클래스 이름 및 분류 등 설계 부분을 다시 리팩토링하는게 맞는 방법입니다. 하지만 사람마다 본인이 머리속에 바로 떠오르는 부분은 굳이 앞 단계를 할 필요는 없다고 생각해서 바로 new Random().nextInt()를 통해 로직을 작성하였습니다. 글을 읽으시는 분들도 본인의 수준에 맞게 어려운 부분은 단순히 테스트만 통과하는 로직을 작성하고 그 이후에 로직작성 및 리팩토링을 해보는게 좋을 거라 생각됩니다. 저 또한 그렇게 하려고 합니다. @ParameterizedTest
@ValueSource(ints = {4,7,9})
@DisplayName("4이상의 수가 입력되어 전진하는 경우")
void 전진하는_경우(int randomValue) {
Car car = new Car("pobi");
car.move(randomValue);
assertThat(car.getPosition()).isEqualTo(1);
}
move
라는 매소드가 존재하지 않고 getPosition()
또한 존재하지 않아 컴파일 오류가 발생합니다. 이를 통과시키는 코드를 작성 해 보겠습니다. 아래의 코드를 통해 이동하는 경우와 정지하는 경우 모든 경우가 하나의 Production 로직으로 해결이 되기 때문에 테스트와 프로덕션 코드 모두를 한 번에 추가하겠습니다. public void move(int randomValue) {
if(randomValue >= MOVE_STANDARD){
this.position++;
}
}
public int getPosition() {
return position;
}
@ParameterizedTest
@ValueSource(ints = {1,0,3})
@DisplayName("3이하의 수가 입력되어 정지하는 경우")
void 정지하는_경우(int randomValue) {
Car car = new Car("pobi");
car.move(randomValue);
assertThat(car.getPosition()).isEqualTo(0);
}