크게 3개의 요소로 구성되어 있다.
JUnit 5 build.gradle
설정
dependencies {
testImplementation('org.junit.jupiter:junit-jupiter:5.5.0')
}
test {
useJUnitPlatform()
}
JUnit을 이용해서 테스트 코드 만드는 법
@Test
어노테이션을 메서드에 붙이기만 하면 된다.import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class SumTest {
@Test
void sum() {
int result = 2 + 3;
assertEquals(5, result);
}
}
@Test
어노테이션을 붙인 메서드는 private이면 안 된다.Assertions 클래스는 여러 단언 메서드를 제공한다.
메서드 | 설명 |
---|---|
assertEquals(expected, actual) | 실제 값(actual)이 기대하는 값(expected)과 같은지 검사한다. |
assertNotEquals(unexpected, actual) | 실제 값(actual)이 특정 값(unexpected)과 같지 않은지 검사한다. |
assertSame (Object expected, Object actual) | 두 객체가 동일한 객체인지 검사한다. |
assertNotSame (Object unexpected, Object actual) | 두 객체가 동일하지 않은 객체인지 검사한다. |
assertTrue (boolean condition) | 값이 true인지 검사한다. |
assertFalse (boolean condition) | 값이 false인지 검사한다. |
assertNull (Object actual) | 값이 null인지 검사한다. |
assertNotNull (Object actual) | 값이 null이 아닌지 검사한다. |
fail() | 테스트를 실패 처리한다. |
try {
AuthService authService = new AuthService();
authService.authenticate(null, null);
fail(); // 이 지점에 다다르면 fail()메서드는 테스트 실패 에러를 발생
} catch(IllegalArgumentException e) {
}
but, 익셉션 발생 유무가 검증 대상이라면 fail() 메서드를 사용하는 것보다 따로 제공하는 익셉션 발생 유무 검사 메서드를 사용하는 것이 더욱 명시적이다.
assertThrows() 을 이용해서 지정한 익셉션이 발생하는지 검사하는 코드
assertThrows(IllegalArgumentException.class,
() -> {
AuthService authService = new AuthService();
authService.authenticate(null, null);
});
assertThrows(IllegalArgumentException.class,
() -> {
AuthService authService = new AuthService();
authService.authenticate(null, null);
});
assertTure(thrown.getMessage().contains("id"));
assertAll(
() -> assertEquals(3, 5/2),
() -> assertEquals(4, 2*2),
() -> assertEquals(6, 11/2)
);
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class LifecycleTest {
public LifecycleTest() {
System.out.println("new LifecycleTest");
}
@BeforeEach
void setUp() {
System.out.println("setUp");
}
@Test
void a() {
System.out.println("A");
}
@Test
void b() {
System.out.println("B");
}
@AfterEach
void tearDown() {
System.out.println("tearDown");
}
}
~ 결과를 보고 알 수 있는 사실 ~
💡 @BeforeEach, @AfterEach 어노테이션을 붙인 메서드는 @Test 어노테이션과 마찬가지로 private면 안 된다.
즉, 각 테스트 메서드는 서로 독립적으로 동작해야 하고, 한 테스트 메서드의 결과에 따라 다른 테스트 메서드의 실행 결과가 달라지면 안 된다.
→ 테스트 메서드가 서로 필드를 공유하거나 실행 순서를 가정하고 테스트를 작성하지 말아야 한다!
자바는 메서드 이름에 공백이나 특수 문자를 사용할 수 없기 때문에 메서드 이름만으로 테스트 내용을 설명하기가 부족할 수 있기에 @DisplayName 어노테이션을 사용해서 테스트에 표시 이름을 붙인다.
@DisplayName("라이프사이클 테스트")
public class LifecycleTest {
@DisplayName("에이!")
@Test
void a() {
System.out.println("A");
}
@Test
void b() {
System.out.println("B");
}
}
src/test/java
폴더에서 테스트를 실행하면 된다.