본문 바로가기

TDD이론과연습&리팩토링

자바 플레이그라운드 with TDD - 문자열 계산기

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
반응형