[Spring MVC] JUnit 단위 테스트 실습
1. StampCalculator 클래스에 대한 단위 테스트 케이스 작성
StampCalculatorTest 클래스 내에 두 개의 테스트 케이스를 JUnit을 사용해서 작성
JUnit의 Assertion 메서드를 사용하려면
import static *org.junit.jupiter.api.Assertions*… 을 사용해야한다.
calculateStampCountTest()
// 수정 전 코드
private static void calculateStampCountTest() {
    // given
    int nowCount = 5;
    int earned = 3;
    // when
    int actual = StampCalculator.calculateStampCount(nowCount, earned);
    int expected = 7;
    // then
    System.out.println(expected == actual);
}
// JUnit 수정 후
@DisplayName("실습1: 스탬프 카운트 계산 단위 테스트")
@Test
public void calculateStampCountTest() {
    // given
    int nowCount = 5;
    int earned = 3;
    // when
    int actual = StampCalculator.calculateStampCount(nowCount, earned);
    int expected = 7;
    // then
    assertEquals(expected, actual);
}
calculateEarnedStampCountTest()
// 수정 전
private static void calculateEarnedStampCountTest() {
    // given
    Order order = new Order();
    OrderCoffee orderCoffee1 = new OrderCoffee();
    orderCoffee1.setQuantity(3);
    OrderCoffee orderCoffee2 = new OrderCoffee();
    orderCoffee2.setQuantity(5);
    order.setOrderCoffees(List.of(orderCoffee1, orderCoffee2));
    int expected = orderCoffee1.getQuantity() + orderCoffee2.getQuantity();
    // when
    int actual = StampCalculator.calculateEarnedStampCount(order);
    // then
    System.out.println(expected == actual);
}
// JUnit 수정 후
@Test
@DisplayName("실습1: 주문 후 누적 스탬프 카운트 계산 단위 테스트")
public void calculateEarnedStampCountTest(){
    Order order = new Order();
    OrderCoffee orderCoffee1 = new OrderCoffee();
    orderCoffee1.setQuantity(3);
    OrderCoffee orderCoffee2 = new OrderCoffee();
    orderCoffee2.setQuantity(5);
    order.setOrderCoffees(List.of(orderCoffee1, orderCoffee2));
    int expected = orderCoffee1.getQuantity() + orderCoffee2.getQuantity();
    int actual = StampCalculator.calculateEarnedStampCount(order);
    assertEquals(expected, actual);
}
2. RandomPasswordGenerator 클래스의 단위 테스트 케이스 작성
RandomPasswordGenerator 클래스의 generate() 메소드는 회원이 로그인 패스워드를 분실했을 경우, 임시 패스워드를 랜덤으로 생성하는 기능.
int numberOfUpperCaseLetters: 생성될 패스워드 문자열에서 알파벳 대문자의 개수int numberOfLowerCaseLetters: 생성될 패스워드 문자열에서 알파벳 소문자의 개수int numberOfNumeric: 생성될 패스워드 문자열에서 0 이상인 숫자의 개수int numberOfSpecialChars: 생성될 패스워드 문자열에서 특수문자의 개수
@DisplayName("실습 3: 랜덤 패스워드 생성 테스트")
@Test
public void generateTest() {
    int numberOfUpperCaseLetters = 2;
    int numberOfLowerCaseLetters = 5;
    int numberOfNumeric = 2;
    int numberOfSpecialChars = 1;
    String password = RandomPasswordGenerator.generate(
            numberOfUpperCaseLetters,
            numberOfLowerCaseLetters,
            numberOfNumeric,
            numberOfSpecialChars
    );
    int findUpper = 0;
    int findLower = 0;
    int findNumeric = 0;
    int findSpecial = 0;
    for(int i=0; i<password.length(); i++){
        char find = password.charAt(i);
        if (find >= 'A' && find <= 'Z') findUpper++;
        else if (find >= 'a' && find <= 'z') findLower++;
        else if (find >= '0' && find <= '9') findNumeric++;
        else findSpecial++;
    }
    assertEquals(numberOfUpperCaseLetters, findUpper);
    assertEquals(numberOfLowerCaseLetters, findLower);
    assertEquals(numberOfNumeric, findNumeric);
    assertEquals(numberOfSpecialChars, findSpecial);
}
추가 학습 (Hamcrest)
Hamcrest는 JUnit 기반의 단위 테스트에서 사용할 수 있는 Assertion Framework이다.
Hamcrest를 사용하는 이유
- Assertion을 위한 Matcher가 자연스러운 문장으로 이어지므로 가독성이 향상 된다.
 - 테스트 실패 메시지를 이해하기 쉽다.
 - 다양한 Matcher를 제공한다.
 
JUnit → Hamcrest
// JUnit Assertion
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class HelloJunitTest {
    @DisplayName("Hello Junit Test")
    @Test
    public void assertionTest1() {
        String actual = "Hello, JUnit";
        String expected = "Hello, World";
        assertEquals(expected, actual);
    }
}
// Hamcrest Assertion
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
public class HelloHamcrestTest {
    @DisplayName("Hello Junit Test using hamcrest")
    @Test
    public void assertionTest1() {
        String expected = "Hello, JUnit";
        String actual = "Hello, World";
        assertThat(actual, is(equalTo(expected)));
    }
}
실행 결과 메시지 차이
// JUnit Assertion
expected: <Hello, World> but was: <Hello, JUnit>
Expected :Hello, World
Actual   :Hello, JUnit
// Hamcrest Assertion
Expected: is "Hello, World"
     but: was "Hello, JUnit"
댓글남기기