파이썬으로 되어있는 예제라서, TDD(테스트 주도 개발) 책을 읽으면서 그냥 넘어갔던 부분인데.. 도무지 그냥 넘어갈 만한 부분이 아닌거 같아서 자바로 코딩해보기로 했습니다. 파이썬으로 코딩해도 되겠지만, 저는 자바로.. 그래서 18장을 우선 코딩해봤습니다.

캬~ 재밌네요.

public class TestCaseTest extends TestCase {

    public TestCaseTest(String methodName) {
        super(methodName);
    }
   
    public void testRunning(){
        WasRun test = new WasRun("testMethod");
        assert test.wasRun == false;
        test.run();
        assert test.wasRun == true;
    }
   
    public static void main(String[] args) {
        new TestCaseTest("testRunning").run();
    }
}

위에 있는 TestCase는 JUnit에 있는게 아닙니다. 직접 구현한 클래스입니다. 구현체는 다음과 같습니다.

public class TestCase {
   
    String methodName;

    public TestCase(String methodName) {
        this.methodName = methodName;
    }
   
    public void run() {
        try {
            Method method = this.getClass().getMethod(methodName, null);
            method.invoke(this, null);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

이것을 상속받은 WasRun은 다음과 같습니다.

public class WasRun extends TestCase {

    boolean wasRun;
   
    public WasRun(String methodName) {
        super(methodName);
        wasRun = false;
    }

    public void testMethod() {
        wasRun = true;
    }

}

TestCase와 WasRun은 원래 하나의 클래스였는데, 책임이 두 개가 되자(하나는 실행됐는지 여부를 확인하는 플래스, 하나는 동적으로 메소드를 실행하는 역할) 그 즉시 리팩터링을 합니다. 상위 클래스를 만들고 그 쪽으로 Pull Up Field, Pull Up Method를 합니다.

코드도.. 정말 딱 테스트가 통과할 만큼만 만들고, 테스트 성공 시킨 다음에는 상수를 변수로 바꾸는 리팩터링 부터 시작해서, 위에서 언급한 리팩터링까지.. 쫘르륵...

캬.. 역시 그냥 읽는 것 보다 한 번 해보는거랑은 차이가 큽니다.