코드 작성
StudyStatus 에는 DRAFT STARTED ENDED 총 세 가지 상태가 존재한다.
public enum StudyStatus {
DRAFT, STARTED, ENDED
}
상태값을 체크하는 getStatus 메서드 - 이늄 값을 리턴
public class Study {
private StudyStatus status;
public StudyStatus getStatus() {
return this.status;
}
}
테스트 코드
@Test
@DisplayName("주누의 개인공부 시간")
void create_new_study() {
Study study = new Study();
assertNotNull(study);
assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값은 DRAFT여야 한다.");
}
assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값은 DRAFT여야 한다.");
위와 같이 메세지를 둘 수도 있다.
마지막 매개변수로 Supplier<String> 타입의 인스턴스를 람다 형태로 제공할 수 있다.
-
복잡한 메시지 생성해야 하는 경우 사용하면 실패한 경우에만 해당 메시지를 만들게 할 수 있다.
에러를 처리할 내용이 복잡할 경우(String을 사용할 경우 무조건 메시지를 띄어준다.)
assertEquals(StudyStatus.DRAFT, study.getStatus(), new Supplier<String>() {
@Override
public String get() {
return null;
}
});
assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값은 DRAFT여야 한다.");
org.junit.jupiter.api.Assertions.*
실제 값이 기대한 값과 같은지 확인 |
assertEqulas(expected, actual) |
값이 null이 아닌지 확인 |
assertNotNull(actual) |
다음 조건이 참(true)인지 확인 |
assertTrue(boolean) |
모든 확인 구문 확인 |
assertAll(executables...) |
예외 발생 확인 |
assertThrows(expectedType, executable) |
특정 시간 안에 실행이 완료되는지 확인 |
assertTimeout(duration, executable) |
assertAll(executables...)
코드 수정
limit 추가 및 limit 파라미터를 받는 생성자 추가
public class Study {
private StudyStatus status;
private int limit;
public Study(int limit) {
this.limit = limit;
}
public StudyStatus getStatus() {
return this.status;
}
public int getLimit() {
return limit;
}
}
getLimit() 테스트, 객체 변경
@Test
@DisplayName("주누의 개인공부 시간")
void create_new_study() {
Study study = new Study(-10);
assertNotNull(study);
assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값은 DRAFT여야 한다.");
assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값은 DRAFT여야 한다.");
assertTrue(study.getLimit() > 0, "스터디 최대 참석인원은 0명 보다 커야 합니다.");
}
이때 첫번째 테스트부터 깨졌기 때문에 두 번째 테스트로는 가지도 않는다.
방안 : assertAll
public static void assertAll(Executable... executables) throws MultipleFailuresError {
AssertAll.assertAll(executables);
}
assertAll(
() -> assertNotNull(study),
() -> assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값은 DRAFT여야 한다."),
() ->assertTrue(study.getLimit() > 0, "스터디 최대 참석인원은 0명 보다 커야 합니다.")
);
assertThrows
참석인원이 0보다 적으면 IllegalArgumentException 던지기
public Study(int limit) {
if (limit < 0) throw new IllegalArgumentException();
this.limit = limit;
}
테스트코드
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> new Study(-50));
String message = exception.getMessage();
assertEquals(message, "학생 수가 너무 작아요");
예외 메시지를 비교할 수도 있다.
AssertJ, Hemcrest, Truth 등의 라이브러리를 사용할 수도 있다
assertTimeout
assertTimeout(Duration.ofMillis(100), () ->{
new Study(10);
Thread.sleep(300);
});
이것의 단점은 테스트가 끝날 때까지 기다린다.
이러한 단점을 보완하기 위해 정해진 테스트 시간이 지나면 종료시키는 assertTimeoutPreemptively를 사용하자
'Java > Test' 카테고리의 다른 글
(Test) JUit5 커스텀 태그 (0) | 2019.12.30 |
---|---|
(Test) JUnit 5 태깅과 필터링 (0) | 2019.12.30 |
(Test) JUnit5 테스트 이름 표기하기 (0) | 2019.12.16 |
(Test) JUnit5 시작하기 (0) | 2019.12.16 |
(Test) JUnit5 소개 (0) | 2019.12.16 |