ToDO
테스트 결과 출력하기

테스트 중에서도 잘 실행하고 종료된 상황을 테스트 합니다.

public class TestCaseTest extends TestCase {

    private WasRun test;

    public TestCaseTest(String methodName) {
        super(methodName);
    }
   
    public void testTemplateMethod(){
        test = new WasRun("testMethod");
        test.run();
        assert test.log.equals("setUp testMethod tearDown ");
    }
   
    public void testResult(){
        test = new WasRun("testMethod");
        TestResult result = test.run();
        assert result.summary().equals("1 run, 0 failed");
    }
   
    public static void main(String[] args) {
        new TestCaseTest("testTemplateMethod").run();
        new TestCaseTest("testResult").run();
    }
}

모든 테스트 케이스 마다 매번 결과를 확인할 수 있도록 설계를 합니다. 그래서 run() 메소드에서 실행 결과를 나타내는 TestResult를 반환 하도록 합니다.

 public class TestCase {
   
    String methodName;

    public TestCase(String methodName) {
        this.methodName = methodName;
    }
   
    public TestResult run() {
        TestResult result = new TestResult();
        result.testStarted();
        setUp();
        try {
            Method method = this.getClass().getMethod(methodName, null);
            method.invoke(this, null);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        tearDown();
        return result;
    }

    protected void tearDown() {}

    protected void setUp() {}
}

물론 첨부터 저렇게 구현하진 않았습니다. 처음에는 그냥 return new TestResult()를 했다가. TestResult에서 설계가 들어갑니다. 결과값을 testStarted()라는 걸 호출 해서 속에 있는 카운터를 증가시키는 구조로 말이죠.

public class TestResult {

    int run;
   
    public void testStarted(){
        this.run += 1;
    }

    public String summary() {
        return run + " run, 0 failed";
    }

}

얘도 첨엔 이렇게 안 생겼었고, 처음엔 상수를 반환했습니다. 그랬다가 일단 앞에 있는 실행 갯수만을 변수화 했고, 위의 설계 결정에 따라 구현을 변경한 겁니다.

리팩터링과, 설계, 그리고 TDD의 관계를 생각하게 만드는 챕터였습니다.