백기선(인프런 강의)/더 자바, 애플리케이션을 테스트하는 다양한 방법
Assertion
레알윙
2020. 5. 18. 00:08
반응형
Assertion 종류
assertEqulas(expected, actual) | 실제 값이 기대한 값과 같은지 확인 |
assertNotNull(actual) | 값이 null이 아닌지 확인 |
assertTrue(boolean) | 다음 조건이 참(true)인지 확인 |
assertAll(executables...) | 모든 확인 구문 확인 |
assertThrows(expectedType, executable) | 예외 발생 확인 |
assertTimeout(duration, executable) | 특정 시간 안에 실행이 완료되는지 확인 duration - 몇초만에 끝내야하는지 |
마지막 매개변수로 Supplier<String> 타입의 인스턴스를 람다 형태로 제공할 수 있다.
- 복잡한 메시지 생성해야 하는 경우 사용하면 실패한 경우에만 해당 메시지를 만들게 할 수 있다.
예시 1
마지막 매개변수 String의 매개변수 사용시
public class Study {
private StudyStatus status;
public StudyStatus getStatus() {
return this.status;
}
}
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class StudyTest {
@Test
@DisplayName("스터디 만들기 \uD83D\uDE31")
void create_new_syudy() {
Study study = new Study();
assertNotNull(study);
assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값이 DRAFT여야 한다.");
}
}
Supplier<String> 사용 및 람다 사용시
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class StudyTest {
@Test
@DisplayName("스터디 만들기 \uD83D\uDE31")
void create_new_syudy() {
Study study = new Study();
assertNotNull(study);
/*
assertEquals(StudyStatus.DRAFT, study.getStatus(), new Supplier<String>() {
@Override
public String get() {
return "스터디를 처음 만들면 상태값이 DRAFT여야 한다.";
}
});
*/
assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값이 DRAFT여야 한다.");
}
}
마지막 매개변수로 String과 Supplier<String>(() -> "메세지")의 차이
마지막에 String 변수가 들어가면 성공하든 실패하든 문자열 연산을 사용하여 표출을 하지만
람다 표현식을 사용을 하면 문자열 연산을 실패했을 때만 사용한다.
즉, 람다표현식을 사용하면 유리하다.
예시2
assertAll, assertNotNull, assertEquals assertTrue 사용
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class StudyTest {
@Test
@DisplayName("스터디 만들기 \uD83D\uDE31")
void create_new_syudy() {
Study study = new Study(-30);
assertAll(() -> assertNotNull(study),
() -> assertEquals(StudyStatus.DRAFT, study.getStatus(),
() -> "스터디를 처음 만들면 상태값이 DRAFT여야 한다."),
() -> assertTrue(study.getLimit() > 0,
() -> "스터디를 최대 참석 가능인원은 0보다 커야 한다."));
}
}
public class Study {
private StudyStatus status = StudyStatus.DRAFT;
private int limit;
public Study(int limit) {
this.limit = limit;
}
public StudyStatus getStatus() {
return this.status;
}
public int getLimit() {
return limit;
}
}
public enum StudyStatus {
DRAFT, STARTED, ENDED
}
예시3
assertThrows, assertEquals 사용
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class StudyTest {
@Test
@DisplayName("스터디 만들기 \uD83D\uDE31")
void create_new_syudy() {
IllegalArgumentException exception =
assertThrows(IllegalArgumentException.class, () -> new Study(-10));
String message = exception.getMessage();
assertEquals("limit는 0보다 커야 한다.", message);
}
}
public class Study {
private StudyStatus status = StudyStatus.DRAFT;
private int limit;
public Study(int limit) {
if(limit < 0) {
throw new IllegalArgumentException("limit는 0보다 커야 한다.");
}
this.limit = limit;
}
public StudyStatus getStatus() {
return this.status;
}
public int getLimit() {
return limit;
}
}
예시 4
assertTimeout
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class StudyTest {
@Test
@DisplayName("스터디 만들기 \uD83D\uDE31")
void create_new_syudy() {
//성공 예시
//assertTimeout(Duration.ofSeconds(10), () -> new Study(10));
//실패 예시
assertTimeout(Duration.ofMillis(100), () -> {
new Study(10);
Thread.sleep(300);
});
}
}
반응형