본문 바로가기
CSE/공부

테스트 메소드 작성

by 0/0 2025. 2. 5.

"JUnit 5 AssertJ를 이용해 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인" 어떻게 할까?

 

JUnit 5는 @Test 애너테이션을 사용해 테스트 메소드 작성

 

 

AssertJ

-assertThat(): 일반적인 값(객체, 숫자, 문자열 등) 검증

assertThat(실제 값).isEqualTo(기대하는 값);

 

예시

void 기능_테스트() {
        assertRandomUniqueNumbersInRangeTest(
                () -> {
                    run("8000", "1,2,3,4,5,6", "7");
                    assertThat(output()).contains(
                            "8개를 구매했습니다.",
                            "[8, 21, 23, 41, 42, 43]",
                            "[3, 5, 11, 16, 32, 38]",
                            "[7, 11, 16, 35, 36, 44]",
                            "[1, 8, 11, 31, 41, 42]",
                            "[13, 14, 16, 38, 42, 45]",
                            "[7, 11, 30, 40, 42, 43]",
                            "[2, 13, 22, 32, 38, 45]",
                            "[1, 3, 5, 14, 22, 45]",
                            "3개 일치 (5,000원) - 1개",
                            "4개 일치 (50,000원) - 0개",
                            "5개 일치 (1,500,000원) - 0개",
                            "5개 일치, 보너스 볼 일치 (30,000,000원) - 0개",
                            "6개 일치 (2,000,000,000원) - 0개",
                            "총 수익률은 62.5%입니다."
                    );
                },
                List.of(8, 21, 23, 41, 42, 43),
                List.of(3, 5, 11, 16, 32, 38),
                List.of(7, 11, 16, 35, 36, 44),
                List.of(1, 8, 11, 31, 41, 42),
                List.of(13, 14, 16, 38, 42, 45),
                List.of(7, 11, 30, 40, 42, 43),
                List.of(2, 13, 22, 32, 38, 45),
                List.of(1, 3, 5, 14, 22, 45)
        );
    }

*assertRandomUniqueNumbersInRangeTest는 따로 만든 메서드이다.

구조는 다음과 같다.

void 기능_테스트() {
    assertRandomUniqueNumbersInRangeTest(
        () -> { /* 실행 코드 */ },
        List.of(...), List.of(...), List.of(...), ... // 예상되는 랜덤 로또 번호 리스트
    );
}

 

첫 번째 인자: 테스트 실행 코드

 -> run(...): 프로그램 실행

 -> assertThat(...): 실행 결과에 예상되는 메시지가 포함되었는지 검증

 

두 번째 인자: 예상되는 랜덤 로또 번호 리스트 -> 실제로 생성된 번호가 이 예상된 번호들과 일치하는지 검증

 

 

-asserThatThrownBy(): 예외가 발생하는지 검증할 때 사용

assertThatThrownBy(() -> 실행할코드)
    .isInstanceOf(예외클래스.class)
    .hasMessage("예상되는 예외 메시지");

 

예시

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThatThrownBy;

@DisplayName("로또 번호에 중복된 숫자가 있으면 예외가 발생한다.")
@Test
void createLottoByDuplicatedNumber() {
        assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5)))
                .isInstanceOf(IllegalArgumentException.class);
    }

 

 

작성해본 테스트 코드

 

 

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.assertThat;

@DisplayName("구입 금액이 1000 단위가 아니면 예외가 발생한다.")
@Test
void moneyIsNotMultipleOf1000() {
		assertThatThrownBy(() -> lottoStore.buyLotto(1500))
		.isInstanceOf(IllegalArgumentException.class);
}

@DisplayName("금액 정상 입력 시 티켓 개수가 올바르게 증가한다.")
@Test
void buyLotto_ShouldGenerateCorrectNumberOfTickets_WhenValidMoneyIsProvided() {
	lottoStore.buyLotto(5000);

	List<List<Integer>> tickets = lottoStore.getLottoTickets();
        assertThat(tickets).hasSize(5);
}

@Override
protected void runMain() {
	Application.startBuyingLotto();
}