JUnit에서 조건값을 바꿔가면서 테스트를 해야하는 경우에 이 방법을 사용하는게 테스트 비용을 아끼는데 좋다.
@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {
private int inputNumber;
private boolean expectedResult;
private PrimeNumberChecker checker;
@Before
public void setup() {
checker = new PrimeNumberChecker();
}
@Parameterized.Parameters
public static Collection<PrimeNumberValidationInput> primeNumbers() {
return Arrays.asList(new PrimeNumberValidationInput[] {
new PrimeNumberValidationInput(2, true),
new PrimeNumberValidationInput(6, false)
});
}
public PrimeNumberCheckerTest(PrimeNumberValidationInput input) {
this.inputNumber = input.number;
this.expectedResult = input.expectation;
}
@Test
public void testCheckerValidatePrimeNumber() {
assertThat(checker.validate(inputNumber), is(expectedResult));
}
}
예제에서는 테스트를 위한 입력으로 PrimeNumberValidationInput이라는 클래스를 사용했다. 다른 책에서 예제를 인용할 때는 보통 Object[][]을 이용하는 경우가 많던데, 물론 간단한 수치 입력을 하는 경우에는 이 방법을 사용해도 크게 나쁘지는 않은 것 같다. 하지만 Object 변수를 사용한다는게 뭔가 테스트 코드의 품질을 떨어트리는 것만 같은 후질근함을 내보하기 때문에 별로 좋아보이지는 않는다. 더구나 코드의 의미 부여적인 측면에서 각 변수의 이름을 살려주는게 테스트의 맥락에서 좀 더 좋아보이기 때문에.
public static class PrimeNumberValidationInput {
public int number;
public boolean expectation;
public PrimeNumberValidationInput(int number, boolean expectation) {
this.number = number;
this.expectation = expectation;
}
}
이런 클래스 하나쯤 테스트 코드에 심어주면 간지나지 않을까 싶다. 테스트를 위해 투자하는거 넘 인색하지 말자. 테스트도 관리해야할 코드 가운데 하나니까 말이다.