1. TestPawn에 색이 없이 말을 생성하는 테스트를 추가한다. 이 테스트는 왜 컴파일 에러를 발생시키는가? 기본으로 횐색의 말을 생성하는 두 번째 생성자를 추가하여 이 컴파일 에러를 고쳐보자.

답보기
[#M_ more.. | less.. |
1장 연습문제를 풀 때 기본 생성자를 지웠기 때문에 당연히 에러가 발생합니다.

PawnTest 클래스에 다음의 메소드를 추가합니다.
[#M_ more.. | less.. |
@Test
   public void CreateWithoutColor(){
       Pawn firstPawn = new Pawn();
       String defaultColor = "white";
       assertEquals(defaultColor, firstPawn.getColor());
   }
_M#]
Pawn 클래스에는 다음의 코드를 추가합니다.
[#M_ more.. | less.. |
public Pawn() {
       this("white");
   }
_M#]

_M#]
2. 두 색상에 대한 상수를 만들고 그 상수를 Pawn 클래스로 옮긴다.

코드보기
[#M_ more.. | less.. |
public class Pawn {

   String color;

   static final String White = "white";

   static final String Black = "black";

   public Pawn() {
       this("white");
   }

   public Pawn(String color) {
       this.color = color;
   }

   public String getColor() {
       return color;
   }
}

public class PawnTest {

   @Test
   public void Create(){
       final String firstPawnColor = "white";
       Pawn firstPawn = new Pawn(Pawn.White);
       assertEquals(firstPawnColor, firstPawn.getColor());

       final String secondPawnColor = "black";
       Pawn secondPawn = new Pawn(Pawn.Black);
       assertEquals(secondPawnColor, secondPawn.getColor());
   }

   @Test
   public void CreateWithoutColor(){
       Pawn firstPawn = new Pawn();
       String defaultColor = Pawn.White;
       assertEquals(defaultColor, firstPawn.getColor());
   }
}
_M#]
3. 장기 말은 체스 판이 없이는 쓸 수 없다. Board 클래스를 정의하기 위한 테스트를 사용한다. 체스 판이 위에 말이 없는 상태로 시작하는 것을 확인한다. TDD(테스트 위주 개발, test driven development) 과정을 적용한다. 가능한 가장 작은 테스트를 작성하고 붉은 막대를 보이며 실패하거나 컴파일 에러가 일어나는 것을 확인한다. 점차적으로 조금씩 코드를 추가하면서 컴파일이 되도록 하고 테스트에서 녹색 막대가 나타나도록 한다.

답보기
[#M_ more.. | less.. |
1094424774.bmp
코드보기
[#M_ more.. | less.. |
public class BoardTest {

   @Test
   public void create(){
       new Board();
   }
}

public class Board {

}
_M#]
_M#]
4. 장기말을 체스판에 추가할 수 있는 코드를 작성한다. 테스트에서 검은 색과 흰색의 말을 체스판에 추가한다. 말을 추가할 때마다 말의 수가 맞는 것을 확인한다. 또한 말을 추가할 때마다 체스판에서 말의 목록을 얻어서 원하는 말 객체를 가지고 있는 것을 확인한다.

답보기
[#M_ more.. | less.. |
문제 하나로 바라는 것도 많군..
BoardTest 에 다음의 코드를 추가합니다.
[#M_ more.. | less.. |
@Test
   public void addPawn(){
       Board chessBoard = new Board();

       Pawn newPawn = new Pawn(Pawn.Black);
       chessBoard.add(newPawn);
       assertEquals( 1, chessBoard.getNumberOfPawns());
       assertEquals( newPawn, chessBoard.getPawn(0));

       newPawn = new Pawn(Pawn.White);
       chessBoard.add(newPawn);
       assertEquals( 2, chessBoard.getNumberOfPawns());
       assertEquals( newPawn, chessBoard.getPawn(1));
   }
_M#]
Board 클래스입니다.
[#M_ more.. | less.. |
public class Board {

   List pawns = new ArrayList();

   public void add(Pawn newPawn) {
       pawns.add(newPawn);
   }

   public int getNumberOfPawns() {
       return pawns.size();
   }

   public Pawn getPawn(int i) {
       return (Pawn) pawns.get(i);
   }

}
_M#]
1047834291.bmp_M#]
5. 지금까지 작성한 각각의 결과 클래스와 메소드에 javadoc을 작성한다. 메소드가 이미 나타내고 있는 정보를 중복해서 보이지 않는다! javadoc은 단지 보충 정보일 뿐이다.

javadoc -package -classpath "소스파일 있는 곳";"junit-4.1.jar파일 있는 곳" *.java

6. 작성한 클래스와 네 개의 테스트를 패키지로 묶는다. 패키지 이름을 chess로 한다. 컴파일 문제를 해결하고 녹색 막대를 다시 확인하자. 또한 import 문을 사용해서 List와 ArrayList의 전체 클래스 이름을 바꾼다.

답보기
[#M_ more.. | less.. |
네 개의 테스트가 아니라 두 개의 테스트인데.. 책의 오타인듯.
1291328692.bmp이미 import문은 사용해버려서.. 고칠게 없습니다.
java.util.List pawns = new java.util.ArrayList(); 이런식으로 사용하길 바랬나봅니다.
_M#]

7. TestPawn과 Pawn을 pices라는 이름의 패키지로 옮기고 이 과정에서의 문제를 해결한다.

1191917577.bmp

8. 체스판에 Pawn 이외의 객체가 추가되지 않도록 한다. 말의 리스트에 new Integer("7")객체를 추가해 보고 컴파일 에러가 발생하는 것을 확인한다.

Board 클래스를 수정합니다.
[#M_ more.. | less.. |
public class Board {

   List<Pawn> pawns = new ArrayList<Pawn>();

   public void add(Pawn newPawn) {
       pawns.add(newPawn);
   }

   public int getNumberOfPawns() {
       return pawns.size();
   }

   public Pawn getPawn(int i) {
       return pawns.get(i);
   }
}
_M#]

9. 각각의 테스트 클래스를 실행하는 테스트 스위트를 생성한다.

1123310080.bmp
10. 지금까지 작성한 코드를 둘러보고 코드에 중복되는 부분이 없는지 확인한다. 테스트 코드 역시 코드임을 기억하자. 필요하다면 setUp 메소드를 사용한다.

BoardTest 클래스를 수정합니다.
[#M_ more.. | less.. |
public class BoardTest {

   Board chessBoard;

   @Before
   public void setUp(){
       chessBoard = new Board();
   }

   @Test
   public void addPawn(){
       Pawn newPawn = new Pawn(Pawn.Black);
       chessBoard.add(newPawn);
       assertEquals( 1, chessBoard.getNumberOfPawns());
       assertEquals( newPawn, chessBoard.getPawn(0));

       newPawn = new Pawn(Pawn.White);
       chessBoard.add(newPawn);
       assertEquals( 2, chessBoard.getNumberOfPawns());
       assertEquals( newPawn, chessBoard.getPawn(1));

   }
}
_M#]