두 가지 모두 테스트 코드를 작성할 때 필수적인 도구로서 각각의 역할이 있습니다.
1. JUnit 5:
- 테스트 프레임워크: JUnit은 자바에서 가장 널리 사용되는 테스트 프레임워크 중 하나이다. 버전 5에서는 JUnit Jupiter로 불리며, JUnit의 최신 버전이다.
- 주요 특징:
- 단위 테스트와 통합 테스트를 위한 풍부한 기능을 제공합니다.
- 어노테이션 기반: @Test, @BeforeEach, @AfterEach와 같은 어노테이션을 통해 테스트 실행 전후의 동작을 정의할 수 있다.
- Assertions 및 Assumptions: 테스트에서 특정 조건을 검증할 수 있게 해주는 assertEquals, assertTrue 등의 메서드를 제공한다.
- 확장 가능한 아키텍처: 커스텀 확장 기능을 만들 수 있으며, 다양한 라이브러리와 쉽게 연동할 수 있다.
2. AssertJ:
- 테스트 검증 라이브러리: AssertJ는 JUnit의 Assertions 메서드보다 더 풍부하고 가독성이 좋은 메서드 체이닝 스타일의 Assertions를 제공합니다.
- 주요 특징:
- 가독성: AssertJ의 검증 구문은 사람이 읽기 쉽게 설계되어 있습니다. 예를 들어 Assertions.assertThat(actual).isEqualTo(expected);와 같은 구문으로 검증할 수 있습니다.
- 유연성: 다양한 타입의 데이터(List, Map, Optional 등)에 대한 검증 메서드가 제공되어 복잡한 조건도 쉽게 검증할 수 있습니다.
- 메서드 체이닝: 다양한 검증 메서드를 체이닝하여 간결하고 직관적인 테스트 코드를 작성할 수 있습니다.
// JUnit 5에서 제공하는 어노테이션을 불러온다.
import org.junit.jupiter.api.Test;
// AssertJ 라이브러리에서 제공하는 정적 메서드 assertThat을 불러옴
// 이렇게 static import를 하면 메서드 클래스 이름 없이 바로 사용할 수 있다.
import static org.assertj.core.api.Assertions.assertThat;
// 테스트 클래스를 정의하는 부분
class MyServiceTest {
// 해당 어노테이션을 통해 메서드가 테스트 메서드 임을 표시함
// JUnit이 이 어노테이션이 붙은 메서드를 실행함
// JUnit 5의 어노테이션
// 이 어노테이션이 붙은 메서드는 테스트 메서드로 실행됨
@Test
void testService() {
// 테스트를 위해 필요한 데이터나 상태 설정
// 준비 (Given)
// 테스트 할 값을 actual 변수에 할당함
String actual = "Hello World";
// AssertJ라이브러리에서 제공하는 검증 시작 메서드
// assertThat(actual)은 검증대상 (actual)을 지정함
// 이후 체이닝 방식으로 다양한 검증 메서드를 연결할 수 있음
// 검증 (Then)
assertThat(actual)
.isNotNull() // 체이닝 메서드 중 하나로, actual이 null이 아닌지 검증, actual이 null이면 테스트 실패
.startsWith("Hello") // actual 문자열이 "Hello"로 시작하는지 검증
.endsWith("World") // actual 문자열이 "Word"로 끝나는지 검증
.isEqualTo("Hello World"); // actual 문자열이 정확히 "Hello World"인지 검증
}
}
위의 예시에서 @Test 어노테이션은 JUnit 5에서 테스트 메서드를 나타내고, assertThat은 AssertJ에서 제공하는 검증 메서드이다. 이런 식으로 JUnit 5로 테스트 환경을 설정하고, AssertJ로 더 가독성 있는 검증을 수행할 수 있다.
package baseball;
import java.util.ArrayList;
import java.util.List;
import camp.nextstep.edu.missionutils.Randoms;
import camp.nextstep.edu.missionutils.Console;
public class Application {
public static void main(String[] args) {
List<Integer> computer = new ArrayList<>();
while(true) {
int exitval = 0;
String num;
String con;
while (computer.size() < 3) {
int ranValue = Randoms.pickNumberInRange(1, 9);
if (!computer.contains(ranValue)) {
computer.add(ranValue);
}
}
//
//System.out.println("computer:"+ computer);
System.out.println("숫자 야구 게임을 시작합니다. ");
System.out.println("숫자를 입력해주세요 : ");
num = Console.readLine();
if (num.length() != 3 || !num.matches("[1-9]{3}") || hasDuplicateDigits(num)) {
throw new IllegalArgumentException();
}
// 첫 번째 자리수
int tmpNum = Integer.parseInt(num);
int one = (tmpNum / 100);
// System.out.println("one:"+one);
// 두 번째 자리수
int two = ((tmpNum % 100) / 10);
// System.out.println("two:"+two);
// 세 번째 자리수
int thr = (tmpNum % 10);
// System.out.println("thr:"+thr);
// 100의 자리 수가 같은 경우
int checkS = 0;
int checkB = 0;
// 리스트를 계속 사용하고 싶다면:
// 만약 리스트를 사용하고 싶다면, 리스트에 맞는 방식으로 처리하도록 코드를 수정해야 한다.
// 예를 들어, 리스트의 요소에 접근하려면 배열이 아닌 리스트의 메서드(get() 등)를 사용해야 한다.
if (one == computer.get(0)) {
checkS += 1;
} else {
if (one == computer.get(1) || one == computer.get(2)) {
checkB += 1;
}
}
//System.out.println("checkS"+ checkS+ "checkB"+ checkB);
if (two == computer.get(1)) {
checkS += 1;
} else {
if (two == computer.get(0) || two == computer.get(2)) {
checkB += 1;
}
}
//System.out.println("checkS"+ checkS+ "checkB"+ checkB);
if (thr == computer.get(2)) {
checkS += 1;
} else {
if (thr == computer.get(0) || thr == computer.get(1)) {
checkB += 1;
}
}
int t3check = 0;
if (checkS == 3) {
System.out.println("3스트라이크");
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
con = Console.readLine();
int tmpCon = Integer.parseInt(con);
if (tmpCon == 2) {
//System.out.println("그만?");
exitval = 1;
break;
}
computer = new ArrayList<>();
checkS = 0;
t3check = 1;
}
if (checkS >= 1 && checkB >= 1) {
System.out.println(checkB + "볼 " + checkS + "스트라이크");
}
if (checkS >= 1 && checkB == 0) {
System.out.println(checkS + "스트라이크");
}
if (checkB >= 1 && checkS == 0) {
System.out.println(checkS + "볼");
}
if (checkS == 0 && checkB == 0) {
if (t3check != 1) {
System.out.println("낫싱");
}
}
t3check = 0;
if (exitval == 1) {
break;
}
}
}
// 입력값의 숫자에 중복이 있는지 확인하는 메서드
private static boolean hasDuplicateDigits(String input) {
char[] chars = input.toCharArray();
return chars[0] == chars[1] || chars[0] == chars[2] || chars[1] == chars[2];
}
}
'프레임워크 > Spring' 카테고리의 다른 글
Spring Core 2 (0) | 2024.08.14 |
---|---|
Spring Core 1 (0) | 2024.08.14 |
Spring JDBC(Java Database Connectivity) 1 (0) | 2024.08.12 |
Spring mvc 4 (MVC Configuration, View Controller, Interceptor, Argument Resolver) (0) | 2024.08.06 |
Spring mvc 3 (예외처리) (0) | 2024.08.05 |