JUnit5란?
자바 개발자가 가장 많이 사용하는 테스팅 프레임 워크
자바 현직 개발자 중 93% Junit 사용, 그 중 51%는 Mockito 사용

- Platform : 테스트를 실행해주는 런처 제공, TestEngine API 제공
- Jupiter : TestEngine API의 구현체로 JUnit5를 제공
- Vintage : JUnit 4와 3을 지원하는 TestEngine 구현체
JUnit5 시작하기
- 스프링 부트 프로젝트 2.2버전 이상부터는 기본적으로 의존성 추가
- 스프링 부트 프로젝트가 아닐경우 다음과 같은 의존성 추가
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
Junit5가 제공하는 Annotations
📌 @overriding 애노테이션 (annotation)
애노테이션은 원래 주석이라는 의미
컴파일러에게 특별한 정보를 제공해주는 역할
생명 주기 Annotations
- @BeforeAll : 해당 클래스에 위치한 모든 테스트 메서드 실행 전에 딱 한번 실행되는 메서드
- @AfterAll : 해당 클래스에 위치한 모든 테스트 메서드 실행 후에 딱 한번 실행되는 메서드
- @BeforeEach : 해당 클래스에 위치한 모든 테스트 메서드 실행 전에 실행되는 메서드
- @AfterEach : 해당 클래스에 위치한 모든 테스트 메서드 실행 후에 실행되는 메서드
- @BeforeAll vs @BeforeEach
- test가 조건에 어떠한 변경도 하지 않는다! → @BeforeAll
- test가 조건에 영향을 미치면 조건을 초기화 해줘야 한다! → @Before Each
@Test
- 테스트 메서드라는 것을 나타내는 어노테이션
- JUnit4와 다르게 어떠한 속성도 선언하지 않는다
//JUnit4
@Test(expected = Exception.class)
void create() throws Exception {
...
}
//Junit5
@Test
void create() {
...
}
@Disabled
- 테스트를 하고 싶지 않은 클래스나 메서드에 붙이는 어노테이션
- class DisabledExample{ @Test @Disabled("문제가 해결될 때까지 테스트 중단") void test() { Sysyem.out.println("테스트"); }
@DisplayName
- 어떤 테스트인지 쉽게 표현할 수 있도록 해주는 어노테이션
- JUnit5에서 가장 활발히 사용하고 있는 어노테이션
- 공백, Emoji, 특수문자 등을 모두 지원
@DisplayName("특수 테스트\\uD83D\\uDE00")
class DisplayNameExample {
@Test
@DisplayName("굉장한 테스트입니다.")
void test(){
}
}
@RepeatedTest
- 특정 테스트를 반복시키고 싶을 때 사용하는 어노테이션
- 반복 횟수와 반복 테스트 이름을 설정 가능
- 성능적 이슈 확인 시 사용
public class ExampleTest {
@DisplayName("Addition Test")
@RepeatedTest(value = 3, name = "{displayName} - repetition {currentRepetition} of {totalRepetitions}")
void add() {
int result = 1 + 2;
assertTrue(result == 3, "1 + 2 should equal 3");
}
}
@ParameterizedTest
- 테스트에 여러 다른 매개변수를 대입해가며 반복 실행할 때 사용하는 어노테이션
//delimiter은 콤마 외에도 구분자를 지정할 수 있는 속성
@ParameterizedTest
@CsvSource(value = {"ACE,ACE:12", "ACE,ACE,ACE:13"}, delimiter = ':')
@Nested
- 테스트 클래스 안에서 내부 클래스를 정의해 테스트를 계층화 할 때 사용
- 내부 클래스는 부모 클래스의 멤버 필드에 접근 가능
- Befor/After와 같은 테스트 생명주기에 관계된 메소드들도 계층에 맞춰 동작

Assertions
- 사전적 의미 : 주장, 행사, 단정문
- 테스트 케이스의 수행 결과를 판별하는 메서드
- 모든 Junit Jupiter Assertions는 static 메서드
assertTimeout(duration, executable)
- 특정 시간 안에 실행이 완료되는지 확인
- duration : 원하는 시간
- executbale : 테스트할 로직
assertAll(executables…)
매개변수로 받는 모든 테스트 코드를 한번에 실행하며 오류가 나도 끝까지 실행 후 모아서 출력
assertAll(
() -> assertNotNUll(study),
() -> assertEquals(...),
() -> assertTrue(...)
);
assertThrows(expectedType, executable)
- 예외 발생을 확인하는 테스트
- executable의 로직이 실행하는 도중 expectedType의 에러 발생 여부 확인
@Test
void exceptionThrow() {
Exception e = assertThrows(Exception.class, () -> new Test(-10));
assertDoesNotThrow(() -> System.out.println("Do Something"));
}
Assumption
- 전제문이 true라면 실행, false라면 종료
- assumeTrue : false일 때 이후 테스트 전체가 실행되지 않음
- assumingThat : 파라미터로 전달된 코드블럭만 실행되지 않음
void dev_env_only() {
assumeTrue("DEV" .equals(System.getenv("ENV")), () -> "개발환경이 아닙니다.");
**assertEquals("A", "A"); // 단정문이 실행되지 않음**
}
void some_test() {
assumingThat("DEV" .equals(System.getenv("ENV")),
() -> {
**assertEquals("A", "B");// 단정문이 실행되지 않음**
});
**assertEquals("A", "A");// 단정문이 실행됨**
}
'Test Code' 카테고리의 다른 글
| Controller 계층에 관한 테스트 (0) | 2026.01.18 |
|---|---|
| TDD란? (0) | 2026.01.18 |