728x90
반응형
목차
단위 테스트 실습 - 문자열 계산기
- 다음 요구사항을 JUnit을 활용해 단위 테스트 코드를 추가해 구현한다.
요구사항
- 사용자가 입력한 문자열 값에 따라 사칙연산을 수행할 수 있는 계산기를 구현해야 한다.
- 문자열 계산기는 사칙연산의 계산 우선순위가 아닌 입력 값에 따라 계산 순서가 결정된다. 즉, 수학에서는 곱셈, 나눗셈이 덧셈, 뺄셈 보다 먼저 계산해야 하지만 이를 무시한다.
- 예를 들어 "2 + 3 * 4 / 2"와 같은 문자열을 입력할 경우 2 + 3 * 4 / 2 실행 결과인 10을 출력해야 한다.
힌트
- 문자열을 입력 받은 후(scanner의 nextLine() 메소드 활용) 빈 공백 문자열을 기준으로 문자들을 분리해야 한다.
String value = scanner.nextLine();
String[] values = value.split(" ");
- 문자열을 숫자로 변경하는 방법
int number = Integer.parseInt("문자열");
메소드 하나에 한 기능이 동작해야한다.
그래서 기능을 여러가지로 쪼개서 만들었다.
결과 코드
package study;
import org.junit.platform.commons.util.StringUtils;
public class StringCalculator {
public int calcultate(String value) {
// 공백이나 null이 들어오면 계산할 수 없다.
if(StringUtils.isBlank(value))
throw new RuntimeException();
return calculateWithOperation(splitValues(value));
}
// 문자열이 들어오면 공백을 기준으로 쪼갠다.
String[] splitValues(String value) {
return value.split(" ");
}
private int calculateWithOperation(String[] values) {
int result = toInt(values[0]);
for(int i = 1; i < values.length; i = i+2) {
// 숫자와 연산자를 이용해서 계산함수를 호출
result = cal(result, toInt(values[i + 1]), values[i]);
}
return result;
}
// 문자열을 숫자로 변환해주는 함수
int toInt(String str) {
return Integer.parseInt(str);
}
// 계산함수
int cal(int x, int y, String oper) {
switch (oper) {
case "+":
return add(x, y);
case "-":
return subtract(x, y);
case "*":
return multiply(x, y);
case "/":
return divide(x, y);
}
throw new RuntimeException();
}
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int divide(int a, int b) {
try {
return a / b;
} catch (Exception e) {
System.out.println("0으로 나눌 수 없습니다.");
}
return 0;
}
int multiply(int a, int b) {
return a * b;
}
}
테스트코드
public class StringCalculatorTest {
StringCalculator stringCalculator;
@BeforeEach
public void setUp() {
stringCalculator = new StringCalculator();
}
@Test
void test(){
int result = stringCalculator.calcultate("2 + 3 * 4 / 2");
assertThat(result).isEqualTo(10);
}
@Test
void testBlank() {
assertThatThrownBy(()-> {
stringCalculator.calcultate(" ");
}).isInstanceOf(RuntimeException.class);
}
}
728x90
반응형
'TDD이론과연습&리팩토링' 카테고리의 다른 글
구글 코딩 컨벤션 위반 Rule 수정하기 (0) | 2022.10.19 |
---|---|
intellij 구글 코딩 컨벤션 적용하기 (0) | 2022.10.19 |
TDD 구현시 체크 사항 (0) | 2022.10.17 |
자바 플레이그라운드 문자열 덧셈 계산기 (0) | 2022.10.13 |
자바 플레이그라운드 with TDD, 클린코드 학습테스트 (1) | 2022.10.07 |