1์ฃผ์ฐจ ํผ๋๋ฐฑ ์ ๋ฆฌ
์ด ๊ธ์ ์ฐํ ์ฝ 1์ฐจ ๊ณผ์ ํผ๋๋ฐฑ์ ํตํด ๋ฐฐ์ด ์ ์ ๊ธฐ๋กํ๋ ๊ธ์ ๋๋ค. ๊ฐ์๋ฅผ ๋ณด๊ณ ์๋ก ์์ฑํ ์ฝ๋๋ ์๋ ๋งํฌ์์ ๋ณด์ค ์ ์์ต๋๋ค.
https://github.com/kite707/java-baseball-6/tree/kite707_feedback
๋จผ์ ์ด๋ฒ 1์ฃผ์ฐจ์ ๊ณตํต ํผ๋๋ฐฑ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
- ์๊ตฌ ์ฌํญ์ ์ ํํ ์ค์ํ๋ค.
- ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์๋ฏธ์๊ฒ ์์ฑํ๋ค.
- git์ ํตํด ๊ด๋ฆฌํ ์์์ ๋ํด์๋ ๊ณ ๋ คํ๋ค.
- Pull Request๋ฅผ ๋ณด๋ด๊ธฐ ์ ๋ธ๋์น๋ฅผ ํ์ธํ๋ค.
- PR์ ํ ๋ฒ ์์ฑํ๋ค๋ฉด ๋ซ์ง ๋ง๊ณ ์ถ๊ฐ ์ปค๋ฐ์ ํ๋ค.
- ์ด๋ฆ์ ํตํด ์๋๋ฅผ ๋๋ฌ๋ธ๋ค.
- ์ถ์ฝํ์ง ์๋๋ค.
- ๊ณต๋ฐฑ๋ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ด๋ค.
- ๊ณต๋ฐฑ ๋ผ์ธ์ ์๋ฏธ ์๊ฒ ์ฌ์ฉํ๋ค.
- space ์ tab์ ํผ์ฉํ์ง ์๋๋ค.
- ์๋ฏธ ์๋ ์ฃผ์์ ๋ฌ์ง ์๋๋ค.
- IDE์ ์ฝ๋ ์๋ ์ ๋ ฌ ๊ธฐ๋ฅ์ ํ์ฉํ๋ค.
mac : โฅโL
window : Ctrl+Alt+L - Java์์ ์ ๊ณตํ๋ API๋ฅผ ์ ๊ทน ํ์ฉํ๋ค.
ex)List<String> members = Arrays.asList("pobi", "jason");
String result = String.join(",", members); // "pobi,jason" - ๋ฐฐ์ด ๋์ Java Collection์ ์ฌ์ฉํ๋ค. Map, Set, List ๋ฑ
์ด ์ค์์ ์ ๊ฐ ์ฐธ๊ณ ํ ๋งํ ๋ถ๋ถ์ ๊ตต๊ฒ ํ์ํ์์ต๋๋ค.
์ฐํ ์ฝ์์๋ 1์ฃผ์ฐจ ๊ณผ์ ์ธ “์ซ์ ์ผ๊ตฌ ๊ฒ์”์ ๋ํด ์์ ํผ๋๋ฐฑ๋ ์ ๊ณตํ์์ต๋๋ค. Java์ ๋ํ ๊ธฐ์ด์ ์ธ ๋ด์ฉ๋ค๊ณผ “์ซ์ ์ผ๊ตฌ ๊ฒ์” ๊ณผ์ ๋ฅผ ์ํํ๋ ๋ชจ์ต์ ๋ผ์ด๋ธ ์ฝ๋ฉ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ์์์ด์์ต๋๋ค.
๋ผ์ด๋ธ ์ฝ๋ฉ์ ํ๊ธฐ ์์ ์ ์ด์จ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋์ ๊ฐ์ด ๋งํ์ต๋๋ค.
- ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ ํด๋์ค๋ฅผ ์ธ์คํด์คํ ํ๋ค.
- ํ์ํ ๊ธฐ๋ฅ์ ์ธ์คํด์ค๊ฐ ์ํํ๊ฒ ํ๋ค.(์์ธํ)
- ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ข ํฉํ๋ค.
์ดํ ๊ฐ๋ฐ ๋ฌธ์๋ฅผ ์์ฑํ์์ต๋๋ค. ์ฐํ ์ฝ์์๋ ๊ฐ๋ฐ ์๊ตฌ์ฌํญ์ ๋ฌธ์๋ก ์ ๋ฆฌํ ๋ค ๊ฐ๋ฐ์ ์์ํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ ๊ฐ ์ด์ ์ ์์ฑํ๋ ๊ฐ๋ฐ ์๊ตฌ์ฌํญ ๋ฌธ์๋ ์๋์ ๊ฐ์์ต๋๋ค.
## ๊ธฐ๋ฅ ๊ตฌํ
- [x] 3์๋ฆฌ ์์์ ์ ๋ต ์์ฑ
- [x] ์ฌ์ฉ์์ ์
๋ ฅ์ ๋ฐ์ ๋ณผ, ์คํธ๋ผ์ดํฌ ๋ฑ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ
- [x] ๊ฒ์ ์ฌ์์์ฌ๋ถ ๊ฒฐ์ ๊ธฐ๋ฅ
## ์์ธ ์ฒ๋ฆฌ
์
๋ ฅ๊ฐ์ด ์กฐ๊ฑด์ ๋ถํฉํ์ง ์์ ์ IllegalArgumentException ๋ฐ์
- [x] ์ฌ์ฉ์๊ฐ ์ซ์๊ฐ ์๋ ๊ฐ์ ์
๋ ฅํ์ ๋
- [x] ์ฌ์ฉ์๊ฐ 3์๋ฆฌ๊ฐ ์๋ ๊ฐ์ ์
๋ ฅํ์ ๋
- [x] ๊ฒ์ ์ฌ์์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ๋ 1์ด๋ 2๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ ์
๋ ฅํ์ ๋
๊ฐ์์ ๋ฑ์ฅํ ๊ฐ๋ฐ ์๊ตฌ์ฌํญ ๋ฌธ์๋ ์๋์ ๊ฐ์์ต๋๋ค.
# ์ซ์ ์ผ๊ตฌ ๊ฒ์
## ๊ธฐ๋ฅ ๋ชฉ๋ก
- [x] 1-9๊น์ง์ ์๋ก ๋ค๋ฅธ ์์์ ์ 3๊ฐ๋ฅผ ์์ฑํ๋ค. NumberGenerator/createRandomNumbers()
- [x] ์ปดํจํฐ์ ์์ ํ๋ ์ด์ด์ ์๋ฅผ ๋น๊ตํ๋ค. - Referee(์ฌํ)/compare()
- [x] ๋ช ๊ฐ์ ์ซ์๊ฐ ๊ฐ์์ง ์ ์ ์๋ค. - Judgement/correctCount()
- [x] ํน์ ์๋ฆฌ์ ํน์ ์ซ์๊ฐ ์๋์ง ์ ์ ์๋ค. - Judgement/hasPlace()
- [x] ๊ฐ์ ์๊ฐ ๋ค๋ฅธ ์๋ฆฌ์ ์์ผ๋ฉด ๋ณผ์ด๋ค.
- [x] ๊ฐ์ ์๊ฐ ๊ฐ์ ์๋ฆฌ์ ์์ผ๋ฉด ์คํธ๋ผ์ดํฌ์ด๋ค.
- [x] ๊ฐ์ ์๊ฐ ์ ํ ์์ผ๋ฉด ๋ซ์ฑ์ด๋ค.
## ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ
๊ธฐ๋ณธ์ ์ผ๋ก 1๋ถํฐ 9๊น์ง ์๋ก ๋ค๋ฅธ ์๋ก ์ด๋ฃจ์ด์ง 3์๋ฆฌ์ ์๋ฅผ ๋ง์ถ๋ ๊ฒ์์ด๋ค.
๊ฐ์ ์๊ฐ ๊ฐ์ ์๋ฆฌ์ ์์ผ๋ฉด ์คํธ๋ผ์ดํฌ, ๋ค๋ฅธ ์๋ฆฌ์ ์์ผ๋ฉด ๋ณผ, ๊ฐ์ ์๊ฐ ์ ํ ์์ผ๋ฉด ๋ซ์ฑ์ด๋ ํํธ๋ฅผ ์ป๊ณ , ๊ทธ ํํธ๋ฅผ ์ด์ฉํด์ ๋จผ์ ์๋๋ฐฉ(์ปดํจํฐ)์ ์๋ฅผ ๋ง์ถ๋ฉด ์น๋ฆฌํ๋ค.
e.g. ์๋๋ฐฉ(์ปดํจํฐ)์ ์๊ฐ 425์ผ ๋
123์ ์ ์ํ ๊ฒฝ์ฐ : 1์คํธ๋ผ์ดํฌ
456์ ์ ์ํ ๊ฒฝ์ฐ : 1๋ณผ 1์คํธ๋ผ์ดํฌ
789๋ฅผ ์ ์ํ ๊ฒฝ์ฐ : ๋ซ์ฑ
๊ธฐ๋ฅ ๋ชฉ๋ก์ ์์ฑํ๋ฉฐ ์ด๋ค ํ์ผ์ ์ด๋ค ํจ์๋ค์ ๋ฐฐ์นํ ์ง ๊ณํํ์ฌ ํจ๊ป ์์ฑํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ ๋ ๊ฐ ๊ธฐ๋ฅ์ ๋ฉ์๋ํํ๊ธฐ๋ ํ์ง๋ง ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ด Application.javaํ์ผ์ ์กด์ฌํ์ต๋๋ค. ๊ฐ๋ฐ ๋ฌธ์๋ฅผ ์์ฑํ๋ ๋ถ๋ถ์ ํตํด ๊ฐ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ ํด๋์ค๋ฅผ ์ธ์คํด์คํ ํ์ฌ ํ์ํ ๊ธฐ๋ฅ์ ์ธ์คํด์ค๊ฐ ์ํํ๊ฒ ํ๋ค. ๋ผ๋ ๊ฒ์ด ์ด๋ค ๋ง์ธ์ง ๋๋ ์ ์์์ต๋๋ค.
์ดํ ์์์ ๋ณธ๋๋ก NumberGenerator, Referee, Judgement ํ์ผ์ ๋ง๋ค์ด ๊ฐ๊ฐ createRandomNumbers(), compare()๋ฑ์ ๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค.
์ฆ ํ์ฌ๊น์ง์ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
์ดํ ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ข ํฉํ์ฌ Application.javaํ์ผ์ ๊ตฌ์ฑํฉ๋๋ค. ์ฐธ๊ณ ๋ฅผ ์ํด Jason์ด ์์ฑํ ์ฝ๋์ ์ ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ฒจ๋ถํ๋๋ก ํ๊ฒ ์ต๋๋ค.
//Jason์ ์ฝ๋
package baseball;
import baseball.domain.NumberGenerator;
import baseball.domain.Referee;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
NumberGenerator generator = new NumberGenerator();
List<Integer> computer = generator.createRandomNumbers();
Referee referee = new Referee();
String result = "";
while (!result.equals("0 ๋ณผ 3 ์คํธ๋ผ์ดํฌ")) {
result = referee.compare(computer, askNumbers());
System.out.println(result);
}
System.out.println("3๊ฐ์ ์ซ์๋ฅผ ๋ชจ๋ ๋งํ์
จ์ต๋๋ค! ๊ฒ์ ์ข
๋ฃ");
}
public static List<Integer> askNumbers() {
System.out.println("์ซ์๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์ : ");
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
List<Integer> numbers = new ArrayList<>();
for (String number : input.split("")) {
numbers.add(Integer.valueOf(number));
}
return numbers;
}
}
//์ ์ถ ์ฝ๋
package baseball;
import camp.nextstep.edu.missionutils.Console;
import camp.nextstep.edu.missionutils.Randoms;
import java.util.ArrayList;
import java.util.List;
public class Application {
public static final int BALL = 1;
public static final int STRIKE = 2;
public static final int NOTHING = 3;
public static final int RESTART = 1;
public static final int LENGTH = 3;
public static List<Integer> getAnswer() {
List<Integer> answer = new ArrayList<>();
while (answer.size() < LENGTH) {
int randomNumber = Randoms.pickNumberInRange(1, 9);
if (!answer.contains(randomNumber)) {
answer.add(randomNumber);
}
}
return answer;
}
public static Integer ballOrStrike(int idx, char userInput, List<Integer> answer) {
int result = NOTHING;
int curInput = userInput - '0';
if (answer.contains(curInput)) {
result = BALL;
}
if (answer.get(idx) == curInput) {
result = STRIKE;
}
return result;
}
public static boolean evaluator(String userInput, List<Integer> answer) {
int strike = 0;
int ball = 0;
for (int i = 0; i < userInput.length(); i++) {
char curInput = userInput.charAt(i);
int result = ballOrStrike(i, curInput, answer);
if (result == BALL) {
ball++;
}
if (result == STRIKE) {
strike++;
}
}
return replyToUser(strike, ball);
}
public static boolean replyToUser(int strike, int ball) {
if (strike == 3) {
System.out.println("3์คํธ๋ผ์ดํฌ\n3๊ฐ์ ์ซ์๋ฅผ ๋ชจ๋ ๋งํ์
จ์ต๋๋ค! ๊ฒ์ ์ข
๋ฃ");
return false;
}
if (ball > 0) {
System.out.print(ball + "๋ณผ ");
}
if (strike > 0) {
System.out.print(strike + "์คํธ๋ผ์ดํฌ ");
}
if (strike == 0 && ball == 0) {
System.out.print("๋ซ์ฑ");
}
System.out.println();
return true;
}
public static boolean isGameRestart(String userRestart) {
if (userRestart.charAt(0) - '0' == RESTART) {
return true;
}
return false;
}
public static void validateUserInput(String userInput) {
if (userInput.length() != LENGTH) {
throw new IllegalArgumentException();
}
for (int i = 0; i < userInput.length(); i++) {
int curInput = userInput.charAt(i) - '0';
if (curInput < 0 || curInput > 9) {
throw new IllegalArgumentException();
}
}
}
public static void validateUserRestart(String userRestart) {
if (userRestart.length() != 1) {
throw new IllegalArgumentException();
}
int curInput = userRestart.charAt(0) - '0';
if (curInput != 1 && curInput != 2) {
throw new IllegalArgumentException();
}
}
public static void main(String[] args) {
System.out.println("์ซ์ ์ผ๊ตฌ ๊ฒ์์ ์์ํฉ๋๋ค.");
boolean isGameRestart = true;
while (isGameRestart) {
List<Integer> answer = getAnswer();
boolean isIncorrect = true;
while (isIncorrect) {
System.out.print("์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ : ");
String userInput = Console.readLine();
validateUserInput(userInput);
isIncorrect = evaluator(userInput, answer);
}
System.out.println("๊ฒ์์ ์๋ก ์์ํ๋ ค๋ฉด 1, ์ข
๋ฃํ๋ ค๋ฉด 2๋ฅผ ์
๋ ฅํ์ธ์.");
String userRestart = Console.readLine();
validateUserRestart(userRestart);
isGameRestart = isGameRestart(userRestart);
}
}
}
์ ์ฝ๋์ ๊ฒฝ์ฐ mainํจ์์์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ์๋นํ ๊ธธ๊ณ , ๊ฐ์ฒด ์งํฅ์ ์์น์ ๋ฐ๋ฅด์ง ๋ชปํ ๊ฒ์ ๋ณด์ค ์ ์์ต๋๋ค.
์ดํ์๋ ํ ์คํธ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์ ๋ณด์ฌ์ฃผ์ จ๋๋ฐ ํ ์คํธ ์ฝ๋์ ๊ฒฝ์ฐ Referee class์ ๋ํ์ฌ ์์ฑํ์์ต๋๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ๋ณด๊ธฐ ์์ Referee์ฝ๋๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ปดํจํฐ๊ฐ ์์ฑํ ์ธ ์๋ฆฌ ์์ ํ๋ ์ด์ด๊ฐ ์ ๋ ฅํ ์ธ ์๋ฆฌ ์๋ฅผ ๋น๊ตํ์ฌ ๋ณผ, ์คํธ๋ผ์ดํฌ๋ฅผ ๊ฐ๊ฐ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋์ ๋๋ค.
package baseball.domain;
import java.util.List;
public class Referee {
public String compare(List<Integer> computer, List<Integer> player) {
final Judgement judgement = new Judgement();
int correctCount = judgement.correctCount(computer, player);
int strike = 0;
for (int placeIndex = 0; placeIndex < player.size(); placeIndex++) {
if (judgement.hasPlace(computer, placeIndex, player.get(placeIndex))) {
strike++;
}
}
int ball = correctCount - strike;
if (correctCount == 0) {
return "๋ซ์ฑ";
}
return ball + " ๋ณผ " + strike + " ์คํธ๋ผ์ดํฌ";
}
}
์ธํ ๋ฆฌ์ ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋งฅ๋ถ์ ๊ฒฝ์ฐ ํด๋น ํ์ผ์์ โ+shift+T, ์๋์ฐ๋ ctrl+shft+T๋ฅผ ๋๋ฅด๋ฉด ์๋์ ๊ฐ์ ํ์ผ์ด ์๋ ์์ฑ๋ฉ๋๋ค.
package baseball.domain;
import static org.junit.jupiter.api.Assertions.*;
class RefereeTest {
}
์ดํ ์คํธ๋ผ์ดํฌ, ๋ณผ์ด ์ ๋ฆฌํด๋๋์ง ์๋์ ๊ฐ์ด compare()ํจ์์ ๊ธฐ๋ฅ์ ๊ฒ์ฆํ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค. ๊ฐ๋ ์ฑ์ ์ํด import๋ฌธ์ ์ ๊ฑฐํ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ๋งํ ์ ์ ๊ฐ ํ
์คํธ์์ ์ค๋ณต๋๋ ๋ถ๋ถ์ ๋ฏธ๋ฆฌ private ๋ณ์๋ก ์ ์ธํด์ฃผ์๋ค๋ ์ , refereeํด๋์ค์ ์์ฑ์๋ฅผ ๊ฐ ํ
์คํธ๊ฐ ์ํ๋๊ธฐ ์ ์ ์คํํ๊ธฐ ์ํด @BeforeEach
๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์
๋๋ค.
class RefereeTest {
**//์ค๋ณต๋๋ ๋ถ๋ถ ๋ฏธ๋ฆฌ ๋ณ์๋ก ์ ์ธ
private Referee referee;
private static final List<Integer> ANSWER = Arrays.asList(1, 2, 3);
@BeforeEach //๊ฐ ํ
์คํธ๊ฐ ์ํ๋๊ธฐ ์ ์คํ
void setUp() {
referee = new Referee();
}**
@Test
void ์คํธ๋ผ์ดํฌ3() {
String result = referee.compare(ANSWER, Arrays.asList(1, 2, 3));
assertThat(result).isEqualTo("0 ๋ณผ 3 ์คํธ๋ผ์ดํฌ");
}
@Test
void ๋ซ์ฑ() {
String result = referee.compare(ANSWER, Arrays.asList(7, 8, 9));
assertThat(result).isEqualTo("๋ซ์ฑ");
}
@Test
void ๋ณผ3() {
String result = referee.compare(ANSWER, Arrays.asList(2, 3, 1));
assertThat(result).isEqualTo("3 ๋ณผ 0 ์คํธ๋ผ์ดํฌ");
}
@Test
void ๋ณผ2_์คํธ๋ผ์ดํฌ1() {
String result = referee.compare(ANSWER, Arrays.asList(1, 3, 2));
assertThat(result).isEqualTo("2 ๋ณผ 1 ์คํธ๋ผ์ดํฌ");
}
}
๊ทธ๋ฐ๋ฐ ์ด ๊ฒฝ์ฐ์๋ ์ฝ๋์ ์ค๋ณต๋๋ ๋ถ๋ถ์ด ์๋นํ ๋ง์ต๋๋ค. ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด @ParameterizedTest
์ @CsvSource
๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด ์ง ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
class RefereeTest {
private Referee referee;
private static final List<Integer> ANSWER = Arrays.asList(1, 2, 3);
@BeforeEach
void setUp() {
referee = new Referee();
}
@ParameterizedTest
@CsvSource({"1,2,3,0 ๋ณผ 3 ์คํธ๋ผ์ดํฌ", "7,8,9,๋ซ์ฑ", "2,3,1,3 ๋ณผ 0 ์คํธ๋ผ์ดํฌ", "1,3,2,2 ๋ณผ 1 ์คํธ๋ผ์ดํฌ"})
public void compare(int number1, int number2, int number3, String expected) {
String actual = referee.compare(ANSWER, Arrays.asList(number1, number2, number3));
assertThat(actual).isEqualTo(expected);
}
์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๊ฐ๋จํ๊ฒ ์ค๋ช
ํ์๋ฉด @CsvSource
์ ์ธ์๋ก ์ฃผ์ด์ง๋ ํฐ ๋ฐ์ดํ์ ์์์ ๋ถํฐ ๋ ์ ์ด ํ๋์ ํ
์คํธ๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. ์ฆ ์๋ ์ฝ๋์์๋ "1,2,3,0 ๋ณผ 3 ์คํธ๋ผ์ดํฌ"๊ฐ ํ๋์ ํ
์คํธ๊ฐ ๋๊ฒ ์ฃ ?
์ด ํ ์คํธ๋ ,(์ฝค๋ง) ๋จ์๋ก compare()ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ๊ฒ ๋๋๋ฐ ์ฌ๊ธฐ์๋ ๊ฐ ์ธ์์ ๊ฐ์ด ์๋์ ๊ฐ์ด ๋ฉ๋๋ค.
๐ compare()ํจ์์ ์ธ์
number1 = 1
number2 = 2
number3= 3
expected = 0 ๋ณผ 3 ์คํธ๋ผ์ดํฌ
@ParameterizedTest๋ ๋ค์ํ ์ด๋ ธํ ์ด์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ ํ๋ผ๋ฏธํฐ๋ก ์ด๋ค ๊ฐ์ด ์ฃผ์ด์ง์ง๋ฅผ ์๋ ค์ฃผ๋ ์ด๋ ธํ ์ด์ ๊ณผ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋๋ฐ์. @CsvSource์ธ์ ๋ค๋ฅธ ์ด๋ ธํ ์ด์ ์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. ValueSource
ValueSource๋ ๋ค์ํ ํ์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค. ๊ฐ ํ์ ๋ช ์ ์๋ฌธ์์ s๋ฅผ ๋ถ์ฌ ํ๋ผ๋ฏธํฐ์ ํ์ ์ ์๋ ค์ค๋๋ค. ๋ค๋ง ํ๋ผ๋ฏธํฐ ์ธ์๋ 1๊ฐ๋ง ๋ฃ์ ์ ์์ต๋๋ค. ์ฆ ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, -1})
public void compare(int number1) {
assertThat(number1 > 0).isEqualTo(true);
}
number1์ 1, 2, 3, -1์ด ๋ค์ด๊ฐ์๋์ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ฐ ํ์ธํ ์ ์์ต๋๋ค.
2. CsvSource
CSV(Comma Seperated Values)๋ ์ฝค๋ง๋ฅผ ๊ธฐ์ค์ผ๋ก CSV๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฝ์ต๋๋ค. ์ฌ๊ธฐ์์ ๊ตฌ๋ถ์ ์ฝค๋ง๋ ๊ธฐ๋ณธ๊ฐ์ด๋ฉฐ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํฉ๋๋ค. ์์ ๋ณธ ๊ฒ๊ณผ ๊ฐ์ด ๊ฐ String๊ฐ์ ์ฝค๋ง๋ก ๊ตฌ๋ถํด ๊ฐ ์ธ์์ ์ง์ด๋ฃ์ต๋๋ค. ์ฆ ์ฌ๋ฌ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ํจ์๋ ํ ์คํธ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
@ParameterizedTest
@CsvSource({"1,2,3,0 ๋ณผ 3 ์คํธ๋ผ์ดํฌ", "7,8,9,๋ซ์ฑ", "2,3,1,3 ๋ณผ 0 ์คํธ๋ผ์ดํฌ", "1,3,2,2 ๋ณผ 1 ์คํธ๋ผ์ดํฌ"})
public void compare(int number1, int number2, int number3, String expected) {
String actual = referee.compare(ANSWER, Arrays.asList(number1, number2, number3));
assertThat(actual).isEqualTo(expected);
}
3. MethodSource
๋ณต์กํ ์ธ์๋ค์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ ๋ฐฉ๋ฒ์ ๋๋ค. Stream์ ๋ฐํํ๋ static ๋ฉ์๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋๋ฐ ์ฌ์ฉ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ์๋์ ๊ฐ์ด Integer๋ฆฌ์คํธ๋ฅผ ๋ฐ์ ๋ฆฌ์คํธ ์ ๊ฐ๋ค์ ํฉ์ณ์ฃผ๋ ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
public class MathUtils {
public static int sum(List<Integer> numbers) {
return numbers.stream().mapToInt(Integer::intValue).sum();
}
}
๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์ฝ๋๋ ์๋์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
class MathUtilsTest {
//stream์ ๋ฐํํ๋ static ๋ฉ์๋
static Stream<List<Integer>> provideNumberLists() {
return Stream.of(
Arrays.asList(1, 2, 3, 4, 5),
Arrays.asList(10, 20, 30, 40, 50),
Arrays.asList(2, 4, 6, 8, 10)
);
}
@ParameterizedTest
@MethodSource("provideNumberLists")
void testSum(List<Integer> numbers) {
int expectedSum = numbers.stream().mapToInt(Integer::intValue).sum();
assertEquals(expectedSum, MathUtils.sum(numbers));
}
}
Stream์ ๋ฐํํ๋ static ๋ฉ์๋๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ์ด ํด๋น ๋ฉ์๋๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ฉ ์ธ์์ ๋ฃ์ต๋๋ค. ์๋ฅผ ๋ค์ด numbers์๋ Arrays.asList(1, 2, 3, 4, 5)
, Arrays.asList(10, 20, 30, 40, 50)
, Arrays.asList(2, 4, 6, 8, 10)
์ ๊ฐ์ด ํ๋์ฉ ๋ค์ด๊ฐ ์ด 3๋ฒ์ ํ
์คํธ๊ฐ ์ํ๋๊ฒ ์ฃ ?
์ค์ ๋ก๋ ์ธ ๋ฒ์ ํ ์คํธ๊ฐ ์ํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ธ์๋ฅผ ์ฌ๋ฌ๊ฐ ๋๊ธฐ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด Arguments.arguments๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
static Stream<Arguments> provideNumberLists() {
return Stream.of(
Arguments.arguments(Arrays.asList(1, 2, 3, 4, 5), 15),
Arguments.arguments(Arrays.asList(10, 20, 30, 40, 50), 150),
Arguments.arguments(Arrays.asList(2, 4, 6, 8, 10), 30)
);
}
@ParameterizedTest
@MethodSource("provideNumberLists")
void testSum(List<Integer> numbers, int answer) {
assertEquals(answer, MathUtils.sum(numbers));
}
Arguments.arguments
๋ก ๋ฌถ์ธ ๋ถ๋ถ์ ํ๋์ ํ
์คํธ๋ก ๋ณด๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ ์ธ์๋ค์ด ๊ฐ๊ฐ ํ
์คํธ ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ๊ฒ ๋๋๋ฐ์. Arguments.arguments(Arrays.asList(1, 2, 3, 4, 5), 15)
๋ถ๋ถ์์๋ ์๋์ ๊ฐ์ด ์ธ์์ ๊ฐ์ด ํ ๋น๋๊ฒ ๋ฉ๋๋ค.
๐ testSumํจ์์ ์ธ์(Arguments.arguments(Arrays.asList(1, 2, 3, 4, 5), 15))
numbers = Arrays.asList(1, 2, 3, 4, 5)
answer = 15
๋ง์ง๋ง์ผ๋ก @ParameterisedTest
์ ์ฃผ๋ฉด ์ข์ ์ ์ฉํ ์ธ์๋ฅผ ์๊ฐํ๊ณ ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ฐ๋ก name์ด๋ผ๋ ์ธ์์ธ๋ฐ์. ํ์ฌ ์ ํ
์คํธ ์ฝ๋๋ฅผ ์ํํ๋ฉด ์๋์ ๊ฐ์ด ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
๋ง์ฝ @ParameterizedTest
์ name์ธ์๋ฅผ ์ฃผ๊ฒ ๋๋ฉด ์ด ๋ถ๋ถ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์คํํด๋ณด๋ฉด
class MathUtilsTest {
static Stream<Arguments> provideNumberLists() {
return Stream.of(
Arguments.arguments(Arrays.asList(1, 2, 3, 4, 5), 15),
Arguments.arguments(Arrays.asList(10, 20, 30, 40, 50), 150),
Arguments.arguments(Arrays.asList(2, 4, 6, 8, 10), 30)
);
}
**@ParameterizedTest(name = "์ฃผ์ด์ง ๊ฐ : {0}, ๊ฒฐ๊ณผ : {1}") //name ์ธ์ ์ฌ์ฉ**
@MethodSource("provideNumberLists")
void testSum(List<Integer> numbers, int answer) {
assertEquals(answer, MathUtils.sum(numbers));
}
}
์๋์ ๊ฐ์ด ํ ์คํธ์ ์ ๋ชฉ์ด ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๐Reference
https://theamabile.tistory.com/21
https://zzang9ha.tistory.com/344
๋๊ธ