티스토리 뷰
7장. 사과와 오렌지
요구사항
카드번호, 유효기간, 결제 금액 값 필요 equals() hashCode() 계좌 수수료 (30%) 공용 getChargeAmt Card와 Account 비교 하기 |
이장에서는 Card, Account 를 비교해 보도록 하자.
기존 테스트 코드에 Card 와 Account 를 비교하는 코드를 넣어보자
@Test
void equalsTest() {
assertTrue(new Card(0.2).equals(new Card(0.2)));
assertFalse(new Card(0.2).equals(new Card(0.3)));
assertTrue(new Account(0.2).equals(new Account(0.2)));
assertFalse(new Account(0.2).equals(new Account(0.3)));
assertFalse(new Account(0.3).equals(new Card(0.3)));
}
테스트 결과는 공포의 빨간막대이다. 이유는 Account(0.3), Card(0.3) 가 다른 객체이지만 우리는 equals 에 변수를 비교만 구현하였기 때문이다, 그러므로 equals 를 수정하도록 하자.
public class Payment {
protected double chargeRate = 0;
protected int chargeAmt = 0;
public boolean equals(Object object) {
Payment payment = (Payment) object;
if (this.chargeAmt != payment.chargeAmt) {
return false;
}
if (this.chargeRate != payment.chargeRate) {
return false;
}
if (!getClass().equals(payment.getClass())) {
return false;
}
return true;
}
}
수정하여 테스트를 돌리면~! 멋진 초록 막대가 보인다~!
오늘도 열심히 했으니, 자랑스럽게 요구 사항에서 하나를 지우자
요구사항
카드번호, 유효기간, 결제 금액 값 필요 equals() hashCode() 계좌 수수료 (30%) 공용 getChargeAmt |
느낌점 :
더 많은 동기가 있기 전에는 더 많은 설계를 도입하지 않기로 하자!
8장 객체 만들기
8장을 보며, 책을 내용과 다르게 생각한 점을 발견했다. Dollar 나, Franc 를 객체로 리턴하는 five 라는 함수를 단순하게, 5를 곱한다라고만 생각을 해서, new 로 객체 리턴을 안하게 했는데, 다시 생각해 보니, 5달러, 10달러, 15달러를 찍어는 팩토리 패턴 이였다.
내가 작성한 예제는 해당 내용이 부족하므로, five 대신에 new 라는 (카드를 새로 만든다는 개념 ?) 으로 위의 작업을 진행하여 추가 했다.
카드번호, 유효기간, 결제 금액 값 필요 equals() hashCode() 계좌 수수료 (30%) 공용 getChargeAmt |
Test 코드 작성
@Test
void newCardIssuanceTest() {
Card newCard = new Card(0.2);
assertEquals(new Card(0.2), newCard.newIssuance(0.2));
assertEquals(new Card(0.3), newCard.newIssuance(0.3));
}
@Test
void newAccountIssuanceTest() {
Account newAccount = new Account(0.2);
assertEquals(new Account(0.2), newAccount.newIssuance(0.2));
assertEquals(new Account(0.3), newAccount.newIssuance(0.3));
}
코드 추가
package com.example.demo;
public class Card extends Payment{
Card(double chargeRate) {
this.chargeRate = chargeRate;
}
public void getChargeAmt(int amt) {
this.chargeAmt = amt *= chargeRate;
}
public int getChargeAmt() {
return this.chargeAmt;
}
public Card newIssuance(double chargeRate) {
return new Card(chargeRate);
}
}
package com.example.demo;
public class Account extends Payment{
Account(double chargeRate) {
this.chargeRate = chargeRate;
}
public void getChargeAmt(int amt) {
this.chargeAmt = amt *= chargeRate;
}
public int getChargeAmt() {
return this.chargeAmt;
}
public Account newIssuance(double chargeRate) {
return new Account(chargeRate);
}
}
이렇게 신속하게~! 나의 잘 못된 예제 케이스를 개발하고 (물론 TDD로~!) 다시 예제를 진행해 보도록 하자.
카드번호, 유효기간, 결제 금액 값 필요 equals() hashCode() 계좌 수수료 (30%) 공용 getChargeAmt + newIssuance 신규 발급 추가 |
이제 계속해서 카드, 계좌 중복에 관련해서 이슈를 해결해 보자
우선 newIssuance 가 상위 class 를 리턴 하도록 수정하여 통일성을 주자,
public Payment newIssuance(double chargeRate) {
return new Card(chargeRate);
}
public Payment newIssuance(double chargeRate) {
return new Account(chargeRate);
}
그런데, 위의 메서드는 비슷한 기능을 하고 있으므로 하나로 합치자,
여기서 우리는 card, account 에 참조를 끊고 싶기 때문에 아래 처럼 테스트 코드를 작성 한다.
@Test
void newCardIssuanceTest() {
Payment newCard = Payment.card(0.2);
assertEquals(new Card(0.2), newCard.newIssuance(0.2));
assertEquals(new Card(0.3), newCard.newIssuance(0.3));
}
그리고, Payment 에 newIssuance 를 추상화 하여 구현해 주자
package com.example.demo;
abstract class Payment {
protected double chargeRate = 0;
protected int chargeAmt = 0;
public boolean equals(Object object) {
Payment payment = (Payment) object;
if (this.chargeAmt != payment.chargeAmt) {
return false;
}
if (this.chargeRate != payment.chargeRate) {
return false;
}
if (!getClass().equals(payment.getClass())) {
return false;
}
return true;
}
static Card card(double chargeRate) {
return new Card(chargeRate);
}
static Account account(double chargeRate) {
return new Account(chargeRate);
}
abstract Payment newIssuance(double chargeRate);
}
이제 테스트 코드를 팩토리 메서트를 테스트 코드에 모두 사용하자.
@Test
void newCardIssuanceTest() {
Payment newCard = Payment.card(0.2);
assertEquals(Payment.card(0.2), newCard.newIssuance(0.2));
assertEquals(Payment.card(0.3), newCard.newIssuance(0.3));
}
@Test
void newAccountIssuanceTest() {
Payment newAccount = Payment.account(0.2);
assertEquals(Payment.account(0.2), newAccount.newIssuance(0.2));
assertEquals(Payment.account(0.3), newAccount.newIssuance(0.3));
}
@Test
void equalsTest() {
assertTrue(Payment.card(0.2).equals(Payment.card(0.2)));
assertFalse(Payment.card(0.2).equals(Payment.card(0.3)));
assertTrue(Payment.account(0.2).equals(Payment.account(0.2)));
assertFalse(Payment.account(0.2).equals(Payment.account(0.3)));
assertFalse(Payment.account(0.3).equals(Payment.card(0.3)));
}
이장에서는 팩토리 패턴을 사용하여 중복 코드를 제거 하고 테스트 코드를 고도화 하였다.
9장. 새카드가 좋아
9장도 시간 time 과 예제에 나온 times 가 비슷해서 언어 유희로 작성한 제목이다... (저자가 엄청 언어유희를 좋아하네....)
나는 예제와는 다른 newIssuance 함수를 쓰기 때문에, 새카드가 좋아로 장이름을 바꾸겠겠다 ㅎㅎ...
카드번호, 유효기간, 결제 금액 값 필요 equals() hashCode() 계좌 수수료 (30%) 카드, 계좌 중복 공용 getChargeAmt + newIssuance 신규 발급 추가 |
책에서는 통화 개념을 사용하였지만, 우리는 나라변 수수료 개념은 사용 해보도록 하겠다.
사용나라 국가를 구하는 메서드를 테스트 코드로 먼저 작성하자.
@Test
void countryCharge() {
assertEquals("Korea", Payment.card(0.2).country());
assertEquals("USA", Payment.account(0.2).country());
}
해당 테스틐 코드가 잘 작동 하도록 하는 메서드는 아래와 같이 개발 하였다. 리팩토링은 과정은 생략하고 완성 코드를 공유 하겠다.
package com.example.demo;
public class Account extends Payment{
Account(double chargeRate, String country) {
this.chargeRate = chargeRate;
this.country = country;
}
public void getChargeAmt(int amt) {
this.chargeAmt = amt *= chargeRate;
}
public int getChargeAmt() {
return this.chargeAmt;
}
public Payment newIssuance(double chargeRate) {
return Payment.account(chargeRate);
}
}
package com.example.demo;
public class Card extends Payment{
Card(double chargeRate, String country) {
this.chargeRate = chargeRate;
this.country = country;
}
public void getChargeAmt(int amt) {
this.chargeAmt = amt *= chargeRate;
}
public int getChargeAmt() {
return this.chargeAmt;
}
public Payment newIssuance(double chargeRate) {
return Payment.card(chargeRate);
}
}
package com.example.demo;
abstract class Payment {
protected double chargeRate = 0;
protected int chargeAmt = 0;
protected String country = "";
public boolean equals(Object object) {
Payment payment = (Payment) object;
if (this.chargeAmt != payment.chargeAmt) {
return false;
}
if (this.chargeRate != payment.chargeRate) {
return false;
}
if (!getClass().equals(payment.getClass())) {
return false;
}
return true;
}
static Card card(double chargeRate) {
return new Card(chargeRate, "Korea");
}
static Account account(double chargeRate) {
return new Account(chargeRate, "USA");
}
abstract Payment newIssuance(double chargeRate);
public String country() {
return this.country;
}
}
소스 코드를 보면 알겠지만, 아직도 우리가 목표로 했던 Card, Account 중복은 해결이 안되었다, 10장에서 본격적으로 중복제거를 진행 하도록 하자.
참고 : 테스트 주도 개발 (켄트 백)
'테스트' 카테고리의 다른 글
테스트 주도 개발_6 (0) | 2023.02.18 |
---|---|
테스트 주도 개발_5 (0) | 2023.02.12 |
테스트 주도개발_3 (0) | 2023.02.12 |
테스트 주도개발_2 (0) | 2023.02.11 |
테스트 주도 개발_1 (0) | 2023.02.05 |
- Total
- Today
- Yesterday
- 테스트주도개발
- 웹서비스
- 퀜트백
- Python
- data crawling
- SpringBoot
- kafka
- 분산처리
- 웹개발
- 테스트
- MSA
- TDD
- nodejs
- mongodb
- MQ
- Python #FastAPI
- EC2
- fastapi
- 테스트 주도 개발
- data mining
- AWS
- 켄트 백
- GateWayApi
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |