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; } }
이런 클래스 하나쯤 테스트 코드에 심어주면 간지나지 않을까 싶다. 테스트를 위해 투자하는거 넘 인색하지 말자. 테스트도 관리해야할 코드 가운데 하나니까 말이다.