티스토리 뷰
[JUnit 5] 3. Assertion(assertNotNull, assertEquals, assertAll, assertThrows, assertTimeout)
mandykr 2021. 12. 8. 12:44Assertions 클래스 사용
import static org.junit.jupiter.api.Assertions.*;
1. assertNotNull
- 값이 null이 아닌지 확인
2. assertEquals
1) public static void assertEquals(Object expected, Object actual, String message)
- param : 기대 값, 실제 값, 테스트 실패 메세지
- 실제 값이 기대한 값과 같은지 확인
2) public static void assertEquals(Object expected, Object actual, Supplier<String> messageSupplier)
- message 를 lambda 형태로 작성 가능
- 메세지를 만드는 과정이 복잡한 경우 사용
public enum StudyStatus {
DRAFT, STARTED, ENDED
}
--------------------------
public class Study {
private StudyStatus status;
public StudyStatus getStatus() {
return status;
}
}
--------------------------
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
Study study = new Study();
assertNotNull(study);
assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값이 DRAFT여야 한다.");
}
}
>> 실행 결과
2. assertAll
1) public static void assertAll(Executable... executables) throws MultipleFailuresError
- param : execute() 추상 메소드를 갖는 Executable 함수형 인터페이스 가변인자
- assertNotNull, assertEquals, assertTrue 등의 메소드에서 테스트가 실패하면 다음 라인으로 넘어가지 않고 종료됨
- 따라서 다음 메소드가 성공인지 실패인지 확인할 수 없어 assertAll로 묶어 실패한 메소드를 모두 확인할 수 있다.
public enum StudyStatus {
DRAFT, STARTED, ENDED
}
--------------------------
public class Study {
private StudyStatus status;
private int limit;
public Study(int limit) {
this.limit = limit;
}
public StudyStatus getStatus() {
return status;
}
public int getLimit() {
return limit;
}
}
--------------------------
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
Study study = new Study(-10);
assertAll(
() -> assertNotNull(study),
() -> assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값이 DRAFT여야 한다."),
() -> assertTrue(study.getLimit() > 0, "스터디 참석 가능 인원은 0보다 커야 한다.")
);
}
}
>> 실행 결과
3. assertThrows
1) public static <T extends Throwable> T assertThrows(Class<T> expectedType, Executable executable)
- executable 파라미터로 넘긴 메소드가 실행할 때 expectedType의 exception이 발생하는지 확인
- exception 의 메세지를 assertEquals 메소드로 확인할 수 있다.
public enum StudyStatus {
DRAFT, STARTED, ENDED
}
--------------------------
public class Study {
private StudyStatus status;
private int limit;
public Study(int limit) {
if (limit < 0) {
throw new IllegalArgumentException("limit은 0보다 커야 한다.");
}
this.limit = limit;
}
public StudyStatus getStatus() {
return status;
}
public int getLimit() {
return limit;
}
}
--------------------------
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study_again() {
IllegalArgumentException exception =
assertThrows(IllegalArgumentException.class, () -> new Study(-10));
assertEquals("limit은 0보다 커야 한다.", exception.getMessage());
}
}
4. assertTimeout
1) public static void assertTimeout(Duration timeout, Executable executable)
- timeout 으로 설정한 특정 시간 안에 실행이 완료되는지 확인
- 설정한 시간이 초과하는 경우 해당 테스트 메소드가 종료되도록 설정하려면 assertTimeoutPreemptively 사용
- assertTimeoutPreemptively 는 Spring transaction과 ThreadLocal 관련해서 확인한 후 사용하자.
@Test
@DisplayName("스터디 만들기")
void create_new_study_again2() {
assertTimeout(Duration.ofMillis(100), () -> {
new Study(10);
Thread.sleep(300);
});
}
>> 실행 결과
출처
https://www.inflearn.com/course/the-java-application-test 더 자바, 애플리케이션을 테스트하는 다양한 방법(백기선)
- Total
- Today
- Yesterday
- mockito
- http
- Ubiquitous Language
- ATDD
- MySQL
- 트랜잭셔널 아웃박스 패턴
- Spring Data JPA
- Spring Boot
- Spring
- named query
- H2
- 스프링 예외 추상화
- 학습 테스트
- 이벤트 스토밍
- spring rest docs
- 스프링 카프카 컨슈머
- kafka
- HTTP 헤더
- 폴링 발행기 패턴
- 마이크로서비스 패턴
- Stream
- 클린코드
- JPA
- 도메인 모델링
- 계층형 아키텍처
- 육각형 아키텍처
- Git
- java8
- clean code
- TDD
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |