소스 코드 오타 확인 해보세요

53 views
Skip to first unread message

mOer

unread,
Aug 10, 2010, 10:31:03 AM8/10/10
to TDDBook-QNA
안녕하세요

먼저 좋은 책 써주셔서 정말 감사합니다. TDD에 관해서 몰랐던 부분을 많이 배우는 것 같습니다. 제가 챕터 4까지 책을 보면
서 소스 코드 부분 오타를 찾아서 정리해 봤습니다. (http://www.hanb.co.kr/book/errata/
errata_view.html?isbn=978-89-7914-726-1 이곳 참조해서 겹치는건 제외 했습니다.)


p199 위쪽 소스코드, 맨 아래줄
userCoupon.getDiscountRate() -> lastCoupon.getName()


p220 IListener 인터페이스
뒷쪽 코드를 전부 반영한다고 할 때 다음 메소드가 추가되어야 합니다.
void documentChanged(String title);
int getDocumentSize(String title);


p223 가장 위쪽 소스코드
중간에 나와있는 에러가 맞다고 가정할 때

원래 소스코드:
documentBox.addDocument("Document", new byte[0]);
documentBox.addDocument("Document", new byte[0]);
documentBox.addDocument("Document", new byte[0]);
documentBox.addDocument("Document", new byte[0]);

수정된 소스코드:
documentBox.addDocument("Document", new byte[0]);
documentBox.documentChanged("Document");
documentBox.documentChanged("Document");
documentBox.documentChanged("Document");


p223 가장 아래 소스코드
아래 메소드 같은 경우, mock에서 호출할 때의 행동을 지정해 주지 않았습니다.
mockListener.documentInfo("Document");

만약 이 코드가 이런 코드였다고 생각해 봐도 mock 객체가 아닌데 호출해 주는게 이상해 보입니다.
documentBox.documentInfo("Document");

저는 이 코드를 삭제하고 DocumentBox.documentInfo() 메소드를 이렇게 구현했습니다.
public String documentInfo(String title) {
return title + ": " + listener.getDocumentSize(title);
}


p248 소스코드
testSound_NOISY() 메소드는 noise.sound() 메소드를 몇 번 호출했는지 테스트 하는데
NoiseChecker.checkDecibel() 메소드의 if-else 문으로 인해 한 번 호출되지 않습니다. 총 5번 호출됩
니다. 저는 다음과 같이 코드를 수정했습니다.

verify(noise).sound(); -> verify(noise, atLeast(1)).sound();


한 번 확인해 보세요~

영회

unread,
Aug 10, 2010, 8:34:46 PM8/10/10
to TDDBook-QNA
내용을 확인해보지 못했지만... Good job 이네요. :)

펭귄너구리

unread,
Aug 11, 2010, 4:27:01 PM8/11/10
to tddbo...@googlegroups.com
안녕하세요?
저야말로 감사드립니다. 읽어주시고, 오타까지 적어보내주시니 부끄러운 마음과 고마운 마음이 함께 듭니다. 현재 자세히 살펴보기 조금 어려운 상황인지라, 최대한 빠른 시간내에 답변드리도록 하겠습니다.
오타로 인해 불편을 드려 죄송합니다.

그럼 좋은 하루 되세요.

ps. 블로그나 트위터 미투하시면 알려주세요. :)
전 미투 주로 합니다.
me2day.net/doortts
twitter.com/doortts


2010년 8월 10일 오전 10:31, mOer <ethd...@gmail.com>님의 말:

Yunseok Choi

unread,
Aug 12, 2010, 1:20:17 AM8/12/10
to tddbo...@googlegroups.com
안녕하세요

제 트위터는 twitter/ethdemor 입니다. (트윗을 많이 하는 편은 아니에요)

다다음주 강의 하실 때 찾아 뵐께요 :-)

2010/8/12 펭귄너구리 <doo...@gmail.com>



--
by mOer

mOer

unread,
Aug 19, 2010, 11:25:13 AM8/19/10
to TDDBook-QNA
챕터 5, 6 보면서 찾은 소스 코드 오타입니다.

p262 소스코드
본문 검은색 동그라미 2번 부분에 driver, URL만 들어갔는데 (아마 생략하신거 같지만) username,
password가 추가되어야 하지 않을까 싶습니다.

p268 소스코드
expected_seller.xml 코드에서 밑에 <item />은 빈 테이블을 만드는 걸로 알고 있는데 item이란 테이블을
책에서 만든적이 없으므로 삭제하는게 좋을 것 같습니다.

p290 Book 클래스 소스코드, p296 Player 클래스 소스코드
super(); 가 왜 있는지 잘 모르겠습니다.

p293 LENIENT_ORDER 소스코드, p295 아래쪽 소스코드 컬렉션의 순서가 다른 경우 부분
expected와 actual 순서가 바뀐 것 같습니다. (테스트 결과에 영향은 없습니다.)
p293 소스코드는 제 생각엔 assertReflectionEquals(myList, Arrays.asList(1, 2,
3), LENIENT_ORDER); 가 맞는 것 같고,
p295 소스코드는 assertLenientEquals(bag, Arrays.asList(300, 200, 100)); 이 맞
을 것 같습니다.

p303 @DataSet
테스트가 계속 실패합니다. 원인을 찾아보니 DbUnit 2.4.7과 Unitils-DbUnit-3.1 (현재 최신버전들) 사용
시 발생하는 에러인 것 같더라구요. PostgreSQL을 사용할 땐 테이블을 찾을 수 없다고 하고, MySQL 사용할 땐 결과
가 없다고 에러났습니다.
해결책은 이 곳(http://blog.javapia.co.kr/67)에서 찾았는데, DbUnit을 2.2.2 버전으로 낮추면
잘 돌아갑니다만 2.2.2 버전에 FlatXmlDataSetBuilder 클래스가 없어서 new
FlatXmlDataSet(File ...) ; 식으로 코드를 바꿔줘야 했습니다.

끝으로 사소한 거지만 p303 소스코드 클래스 이름이 RepositoryTest -> DatabaseRepositoryTest
수정됐는데 이건 오타인지 잘 모르겠습니다;

펭귄너구리

unread,
Aug 20, 2010, 3:55:13 PM8/20/10
to tddbo...@googlegroups.com
안녕하세요? mOer님!

주신 내용은 저번것까지 포함해서 확인중에 있습니다.
(혹 왤케 내 의견만 반영이 늦지? 라고 생각하실까봐.. ^^;)
그리고 일부는 오타 정정란에 표기해 놓았습니다.

덕분에
제가 미처 생각지 못했던 부분들도 발견하게 되었고요.
꼼꼼히 봐 주셔서 뭐라 감사인사를 드려야 할런지..

감사합니다.
조만간 뵈면 제가 음료라도 한 잔 대접하겠습니다! :)

ps. 시차적응 실패로 생활리듬 꽈당! 입니다. (지금 새벽 4시50분-_-)


2010년 8월 20일 오전 12:25, mOer <ethd...@gmail.com>님의 말:

펭귄너구리

unread,
Aug 20, 2010, 4:24:03 PM8/20/10
to tddbo...@googlegroups.com
일부내용에 대한 검토의견입니다.
몇몇 부분은 설명이 자세하지 않았어서 혼란스러우셨던것 같습니다.
불편을 끼쳐드린것 같아 죄송합니다.



p199 위쪽 소스코드, 맨 아래줄
-------주신의견-------------
userCoupon.getDiscountRate() -> lastCoupon.getName()
----------------------------
=> 알려주신 내용 반영하였습니다.

p223 가장 위쪽 소스코드는

예제가 이벤트 리스너를 등록해서 문서함인 documentBox에 변경이 일어나면(추가,수정,삭제등)
리스너가 이를 감지해서 리스너의 documentChanged가 callback으로 호출되는 예제입니다.
따라서 최 상단 소스코드는 의도 그대로 입니다.
replay이후, 문서함에 새로운 문서가 네 개 더 추가된 셈입니다.

p220 IListener 인터페이스
void documentChanged(String title);
는 이미 인터페이스에 들어있습니다.

int getDocumentSize(String title);
=> 그리고 이건 223p 소스를 기준으로 추가해야 하는게 맞네요. :)

p223 가장 아래 소스코드
-------주신의견-------------

아래 메소드 같은 경우, mock에서 호출할 때의 행동을 지정해 주지 않았습니다.
mockListener.documentInfo("Document");
----------------------------

=> 단순히 호출여부만 검사하기 위해 mocking 작업을 할 경우엔 호출시 행동을 지정해 주지 않아도 됩니다. 따라서 뒤에 단순히 verify만 하고 있습니다. 책에도 썼지만 easymock의 record / replay 방식이 이래서 사용자들을 자칫 혼란스럽게 만듭니다. 마찬가지로 예상대로의 코드 맞습니다.

p248 소스코드
-------주신의견-------------

testSound_NOISY() 메소드는 noise.sound() 메소드를 몇 번 호출했는지 테스트 하는데
NoiseChecker.checkDecibel() 메소드의 if-else 문으로 인해 한 번 호출되지 않습니다. 총 5번 호출됩
니다. 저는 다음과 같이 코드를 수정했습니다.

verify(noise).sound(); -> verify(noise, atLeast(1)).sound();
----------------------------


262p 소스코드
-------주신의견-------------

본문 검은색 동그라미 2번 부분에 driver, URL만 들어갔는데 (아마 생략하신거 같지만)  username,
password가 추가되어야 하지 않을까 싶습니다.
----------------------------

=> 예제에서는 DB가 derby의 embedded 버전이라 id/password는 사용하지 않습니다. 다만 그 외의 DB를 사용할때는 말씀주신것 처럼 id/password가 필요합니다.

268p 중간 데이터셋 코드 expected_seller.xml
item이란 테이블을 책 예제에서 사용한 적이 없으므로 <item /> 항목 삭제

290p 중간 Book 클래스 소스코드
super()메소드는 무의미함. 이클립스의 코드 자동생성 기능을 이용해서 생성자를 만들때 끼어들어 갔습니다.p296 Player 클래스 소스코드의 super() 메소드도 마찬가지. 아무 의미가 없음.


p293 LENIENT_ORDER 소스코드, p295 아래쪽 소스코드 컬렉션의 순서가 다른 경우 부분
-------주신의견-------------

expected와 actual 순서가 바뀐 것 같습니다. (테스트 결과에 영향은 없습니다.)
----------------------------
=> 바뀌지 않았습니다. 예제 문장을 짧게 만들다보니 그렇게 보셨던것 같습니다.
myList를 어딘가에서 받아온다고 생각한것이고, expected는 하드코딩된 값( Arrays.asList..)인 모습입니다. 이 내용은 이어서 적어주신 293p와 295p 모두 동일합니다.


303p의 DatabaseRepositoryTest는 의도한 대로의 이름입니다. Repository가 인터페이스이고 그에 대한 구현 케이스 중 하나인 DatabseRepository에 대한 테스트이기 때문입니다.

2010년 8월 20일 오전 12:25, mOer <ethd...@gmail.com>님의 말:
챕터 5, 6 보면서 찾은 소스 코드 오타입니다.
Reply all
Reply to author
Forward
0 new messages