내가 작성한 코드가 제대로 동작하는지 확인하는 가장 좋은 방법은 테스트 코드를 실행해 보는 것입니다.
지난번에 자바 객체지향 설계 실습으로 구현한 ‘Hangman Game’ 프로젝트에 이번에는 JUnit과 Mockito를 활용해 테스트 코드를 작성해보려 합니다!
| "테스트를 작성하고 실행"하는 프레임워크
| 테스트 메서드를 작성하고, 예상 결과와 실제 결과를 비교해서 맞는지 확인
| 테스트 대상이 의존하는 객체를 가짜로 만들어주는 라이브러리
| 실제 DB, API, 네트워크 같은 외부 자원에 연결하지 않고 동작을 흉내냄
HangMan Game을 구현한 프로젝트에 테스트코드를 작성해보겠다. 이 프로젝트는 Maven프로젝트가 아니므로 .jar파일을 다운로드해서 라이브러리를 추가해주겠다.

각 라이브러리가 잘 작동하는 지 테스트 해보자
| 잘 되는걸 볼 수 있다



module java.base does not "opens java.lang" to unnamed module
? 실행 안됨 => java.lang을 열 수 없다

--add-opens java.base/java.lang=ALL-UNNAMED
java.base 모듈 안에 있는 java.lang 패키지를 모든 "이름 없는 모듈"을 열어주도록 옵션 추가하기

이제 잘 된다.
package test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.junit.jupiter.api.Test;
import dev.GameController;
public class GameControllerTest {
@Test
void testInputCategory_withSystemIn() {
// 테스트할 입력값, 엔터(줄바꿈) 포함
String simulatedUserInput = "5\n0\n2\n";
InputStream originalIn = System.in;
try {
// System.in 을 시뮬레이션 입력 스트림으로 변경
ByteArrayInputStream testIn = new ByteArrayInputStream(simulatedUserInput.getBytes());
System.setIn(testIn);
int category = GameController.inputCategory();
assertEquals(2, category);
} finally {
// 테스트 후 원래 System.in 복구
System.setIn(originalIn);
}
}
}
