본문 바로가기

Java/Test

(Test) JUnit5 : Assertion

코드 작성

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명 보다 커야 합니다.")
);

실행결과 assertAll 내부 모든 테스트 케이스 실행

 

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 등의 라이브러리를 사용할 수도 있다

 

 

AssertJ / Fluent assertions for java

AssertJ Fluent assertions for java

joel-costigliola.github.io

 

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