티스토리 뷰

Assertions 클래스 사용

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 더 자바, 애플리케이션을 테스트하는 다양한 방법(백기선)

728x90