Skip to content

Commit

Permalink
5장: 사용자 레벨 관리 기능 추가 - 코드 개선
Browse files Browse the repository at this point in the history
UserService.upgrade 메소드는 GOLD인 사용자가 호출한다면 문제가 되고, grade가 늘어난다면 if문이 점점 더 길어지는 문제가 있다.

- grade의 순서와 다음 단계의 grade가 무엇인지 결정하는 일은 Grade에게
- 사용자의 정보가 바뀌는 부분은 User에게 (예외 검증도 스스로 할 수 있도록, 다른 어느 곳에서 사용할 수도 있으니까 ~)
=> 객체 지향 적이 된다!

User 클래스의 테스트도 추가하자
  • Loading branch information
kimdahyeee committed Mar 28, 2020
1 parent 645eba7 commit 10a7f22
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 5 deletions.
10 changes: 8 additions & 2 deletions src/main/java/com/toby/tobyspring/user/domain/Grade.java
@@ -1,18 +1,24 @@
package com.toby.tobyspring.user.domain;

public enum Grade {
BASIC(1), SILVER(2), GOLD(3);
GOLD(3, null), SILVER(2, GOLD), BASIC(1, SILVER);

private final int value;
private final Grade next;

Grade(int value) {
Grade(int value, Grade next) {
this.value = value;
this.next = next;
}

public int intValue() {
return value;
}

public Grade nextGrade() {
return this.next;
}

public static Grade valueOf(int value) {
switch (value) {
case 1:
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/toby/tobyspring/user/domain/User.java
Expand Up @@ -68,4 +68,13 @@ public User(String id, String name, String password, Grade grade, int login, int
this.login = login;
this.recomend = recomend;
}

public void upgrade() {
Grade nextGrade = this.grade.nextGrade();
if (nextGrade == null) {
throw new IllegalArgumentException(this.grade + "은 업그레이드가 불가능합니다.");
} else {
this.grade = nextGrade;
}
}
}
Expand Up @@ -53,8 +53,7 @@ private boolean canUpgrade(User user) {
}

private void upgrade(User user) {
if (Grade.BASIC.equals(user.getGrade())) user.setGrade(Grade.SILVER);
else if (Grade.SILVER.equals(user.getGrade())) user.setGrade(Grade.GOLD);
user.upgrade();
userDao.update(user);
}

Expand Down
42 changes: 42 additions & 0 deletions src/test/java/com/toby/tobyspring/user/domain/UserTest.java
@@ -0,0 +1,42 @@
package com.toby.tobyspring.user.domain;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

class UserTest {
User user;

@BeforeEach
public void setUp() {
user = new User();
}

@Test
@DisplayName("user의 upgrade() 테스트")
public void upgrade() {
Grade[] grades = Grade.values();
for (Grade grade : grades) {
if (grade.nextGrade() == null) continue;
user.setGrade(grade);
user.upgrade();
assertEquals(grade.nextGrade(), user.getGrade());
}
}

@Test
@DisplayName("user의 upgrade() exception 테스트")
public void cannotUpgrade() {
Grade[] grades = Grade.values();
for (Grade grade : grades) {
if (grade.nextGrade() != null) continue;
user.setGrade(grade);
assertThrows(IllegalArgumentException.class, () -> {
user.upgrade();
});
}
}
}
Expand Up @@ -48,7 +48,7 @@ public void bean() {

@Test
@DisplayName("사용자 레벨 업그레이드 테스트")
public void upgradeGrades() {
public void upgrades() {
userDao.deleteAll();
for (User user : users) userDao.add(user);

Expand Down

0 comments on commit 10a7f22

Please sign in to comment.