자바/초록스터디

(3)초록스터디 step1 - 초간단 계산기 구현: 계산기 MVC 패턴 구현, JUnit5 테스트 적용

문상휘파람 2024. 5. 6. 13:16

드디어 !! Junit5 단위 테스트 적용할 시간이다..! 빨리 테스트 구현해보고 싶움.


일단 계산기는 다음과 같이 구현했따.

package domain;

public class Calculator {

    final int DO_NOT_BE_DIVIDE_NUMBER = 0;

    public int add(int num1, int num2) {
        return num1 + num2;
    }

    public int subtract(int num1, int num2) {
        return num1 - num2;
    }

    public int multiple(int num1, int num2) {
        return num1 * num2;
    }

    public int divide(int num1, int num2) {
        if (num2 == DO_NOT_BE_DIVIDE_NUMBER) {
            throw new ArithmeticException("0으로 나눌 수 없습니다.");
        }
        return num1 / num2;
    }

}

자바 컨벤션에 맞게 잘 작성하였다.(틀린 부분 있으려나..?)  그리고 나누기 메서드에서 나누는 수가 0일때 예외처리를 해주었다. 

이 부분 말고 딱히 어려운 부분은 없었다. 근데 예외처리도 다른 파일에 만들어서 진행해야 하는지 고민이 들긴 함. 최대한 클린코드 만들어주려고...


테스트 코드는 크게 두 부분으로 나누어서 진행하였다. 올바를 때와 잘못되었을 때, 이렇게 크게 2가지로 나누었다. 사실 이번 테스트는 테스트 하려는 메서드 자체가 너무 간단해서 딱히 설명할 부분이 없다.

 

* 더하기 테스트

@Test
@DisplayName("더하기 테스트")
void 더하기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 2;
    final int expected = 3;

    //when
    final int actual = calculator.add(num1, num2);

    //then
    assertEquals(expected, actual);
}

@Test
@DisplayName("잘못된 더하기 테스트")
void 잘못된_더하기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 2;
    final int unexpected = 4;

    //when
    final int actual = calculator.add(num1, num2);

    //then
    assertNotEquals(unexpected, actual);
}

앞에서 Junit5 학습한 내용을 보았다면, 크게 어려운 내용은 없다. 자바 테스트 컨벤션 같은 경우는 다른 블로그들을 참고했다.

 

* 빼기 테스트

@Test
@DisplayName("빼기 테스트")
void 빼기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 2;
    final int expected = -1;

    //when
    final int actual = calculator.subtract(num1, num2);

    //then
    assertEquals(expected, actual);
}

@Test
@DisplayName("잘못된 빼기 테스트")
void 잘못된_빼기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 2;
    final int unexpected = 0;

    //when
    final int actual = calculator.subtract(num1, num2);

    //then
    assertNotEquals(unexpected, actual);
}

 

* 곱하기 테스트

@Test
@DisplayName("곱하기 테스트")
void 곱하기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 2;
    final int expected = 2;

    //when
    final int actual = calculator.multiple(num1, num2);

    //then
    assertEquals(expected, actual);
}

@Test
@DisplayName("잘못된 곱하기 테스트")
void 잘못된_곱하기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 2;
    final int expected = 0;

    //when
    final int actual = calculator.multiple(num1, num2);

    //then
    assertNotEquals(expected, actual);
}

 

 

* 나누기 테스트

@Test
@DisplayName("나누기 테스트")
void 나누기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 2;
    final int expected = 0;

    //when
    final int actual = calculator.divide(num1, num2);

    //then
    assertEquals(expected, actual);
}

@Test
@DisplayName("분모가 0일때 나누기 테스트")
void 분모가_0일때_나누기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 0;
    final var expected = "0으로 나눌 수 없습니다.";

    //when
    final ArithmeticException arithmeticException = assertThrows(ArithmeticException.class, () -> calculator.divide(num1, num2));

    //then
    assertEquals(expected, arithmeticException.getMessage());
}

@Test
@DisplayName("잘못된_나누기 테스트")
void 잘못된_나누기_테스트() {
    //given
    final Calculator calculator = new Calculator();
    final int num1 = 1;
    final int num2 = 2;
    final int expected = 1;

    //when
    final int actual = calculator.divide(num1, num2);

    //then
    assertNotEquals(expected, actual);
}

나누기는 나누는 수가 0일 때가 있으므로, 이 경우를 포함해서 크게 3가지로 나누어 테스트를 진행했다. 역시 테스트를 진행할 때 가장 까다로웠던 부분이 나누는 수가 0일때 였고, 해당 부분의 테스트는 예외처리의 메세지가 똑같으면 테스트를 통과하는 식으로 메서드를 작성했다.!!

 

 

일단, Junit5 공부한 것을 바탕으로 위에 보이는 것처럼 메서드에 대한 단위 테스트를 진행하였고 다음에는 조금 더 어려운 문자열 계산기를 구현하여 단위테스트를 진행할 것이다. 화이링~