JUnit5 는 세 개의 서브 프로젝트로 구성되어 있다.
JUnit Platform은 JVM에서 테스트 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공한다.
JUnit Jupiter는 테스트를 작성하고 확장하기 위한 새로운 프로그래밍 모델과 확장 모델의 조합이다.
JUnit Vintage는 JUnit3 및 JUnit4 기반 테스트를 실행하기 위한 엔진을 제공한다.
JUnit 코드의 기본 구조는 간단하다. 테스트로 사용할 클래스를 만들고 메서드에 @Test 어노테이션을 붙이면 된다. 이때 private를 붙이지 않도록 한다.
import static org.junit.jupiter.api.Assertions.assertEquals;
import example.util.Calculator;
import org.junit.jupiter.api.Test;
class MyFirstJUnitJupiterTests {
private final Calculator calculator = new Calculator();
@Test
void addition() {
assertEquals(2, calculator.add(1, 1));
}
}
Method | Description |
---|---|
assertEquals(expected, actual) | 실제 값이 기대하는 값(첫 번째 인자)과 같은지 검사 |
assertNotEquals(unexpected, actual) | 실제 값이 특정 값과 같이 않은지 검사 |
assertSame(Object expected, Obejct actual) | 두 객체가 동일한 객체인지 검사 (expected.equals(actual)) |
assertNotSame(Object expected, Obejct actual) | 두 객체가 동일하지 않은 객체인지 검사 |
assertTrue(boolean condition) | 값이 true인지 검사 |
assertFalse(boolean condition) | 값이 false인지 검사 |
assertNull(Object actual) | 값이 null인지 검사 |
assertNotNull(Obejct actual) | 값이 null이 아닌지 검사 |
fail() | 테스트를 실패 처리 |
Method | Description |
---|---|
assertThrows(Class<T> expectedType, Executable executable) | executable을 실행한 결과로 지정한 타입의 예외가 발생하는지 검사 |
assertDoesNotThrow(Executable executable) | executable을 실행한 결과로 예외가 발생하지 않는지 검사 |
@Test
void exceptionTesting() {
Exception exception = assertThrows(ArithmeticException.class, () ->
calculator.divide(1, 0));
assertEquals("/ by zero", exception.getMessage());
}
assert 메서드는 실패하면 다음 코드를 실행하지 않고 바로 예외를 발생한다. 모든 검증을 실행하고 그중에 실패한 것이 있는지 확인하고 싶은 경우 assertAll() 메서드를 사용한다. 실패한 코드가 있으면 그 목록을 모아서 에러 메시지로 보여준다.
@Test
void groupedAssertions() {
assertAll("person",
() -> assertEquals("Jane", person.getFirstName()),
() -> assertEquals("Doe", person.getLastName())
);
}
JUnit은 각 테스트 메서드를 실행하기 전에 각 테스트 클래스의 새 인스턴스를 만듭니다.
이는 개별 테스트 메서드를 격리하여 실행할 수 있도록 하고, 변경 가능한 테스트 인스턴스 상태로 인한 예기치 않은 부작용을 피하기 위해서이다. 이 생명 주기는 JUnit Jupiter의 기본 동작이며 이전 버전의 JUnit과 유사하다.
(@Disabled, @DisabledOnOs 등의 비활성화 어노테이션을 붙여도 동일하게 새로운 인스턴스를 생성한다.)
@BeforeEach : 현재 클래스의 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 붙어있는 테스트 메소드가 실행되기 전 실행
한다. JUnit4의 @Before 어노테이션과 같은 역할을 한다.
@AfterEach : 현재 클래스의 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 붙어있는 테스트 메소드가 실행되고 난 후 실행
한다. JUnit4의 @After 어노테이션과 같은 역할을 한다.
@BeforeAll : 클래스의 모든 테스트 메서드를 실행하기 전
에 한 번만 실행된다.
@AfterAll : 클래스의 모든 테스트 메서드를 실행한 후
에 한 번만 실행된다.
테스트 메서드가 서로 실행 순서 의존에 의존하지 않고 같은 필드를 공유해서 사용하지 않도록 작성한다. 각 테스트 메서드는 서로 독립적으로 동작해야 한다. JUnit은 테스트 메서드의 실행 순서를 지정하는 방법을 제공하고 있지만 메서드 간에 의존이 생기면 유지보수가 어렵게 된다.