"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();
}'CSE > 공부' 카테고리의 다른 글
| [HTTP 웹 기본 지식] 2. URI와 웹 브라우저 요청 흐름 (1) | 2025.08.19 |
|---|---|
| [HTTP 웹 기본 지식] 1. 인터넷 네트워크 (2) | 2025.07.31 |
| README 파일 작성 (0) | 2025.02.10 |
| GitHub | 커밋 메시지 작성 (0) | 2025.02.07 |
| Java | 열거형(Enum), 생성자, this (1) | 2025.02.05 |