목표: JUnit5 를 알아보자
JUnit5는 크게 세 개의 요소로 나누어져있다
현재 build.gradle 의 dependencies 내에 등록되어있는 jupiter는 JUnit을 실행시키기 위한 모듈이다.
plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
test {
useJUnitPlatform()
}
@Test
를 붙인다.@Test
void helloTest() {
}
assertEquals()
같은 다양한 검증 정적 메서드를 제공한다.assertEquals(expected, actual)
expected 값과 actual 값의 순서를 주의해야한다.a=1; b=1; sum(a, b);
해당 메서드의 기대되어지는 값은? (expected)sum(a, b)
는 actual이 된다.assertThrows()
나 assertDoesNotThrow()
를 쓰는 게 더 명시적이다.assertThrows()
는 발생한 익셉션 객체를 리턴한다. 아래처럼 사용가능하다.IlegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
() -> {
...
});
assertTrue(thrown.getMessage().contains("id");
assertAll()
을 사용하면 된다.@BeforeEach
and @AfterEach
@BeforeEach
메서드 실행@Test
메서드 실행@AfterEach
메서드 실행https://github.com/kyupid/tddb/commit/9d29f9c716e853a6b24def9b19aabb63900f4513
위 코드 참고하여 테스트 해보면 테스트 클래스의 객체가 두번 생성되어지는 것을 확인할 수 있다.
@BeforeAll
and @AfterAll
모든 테스트 메서드가 실행되기 전이나 후에 수행할 작업을 넣으면 된다.
테스트 메서드 간의 실행 순서를 생각하거나 필드를 공유해서는 안된다.
JUnit에서 실행 순서를 지정하는 법을 제공하고 있긴 하지만, 테스트 메서드 간의 의존이 생기면 유지보수가 어려워진다.
한 테스트의 메서드의 결과에 따라 다른 테스트 메서드의 결과가 달라지거나 하면 안되고 독립적이어야한다.
테스트 코드 또한 코드이기 때문에 유지보수에 신경을 써야한다.