Spring Boot/JUnit5

[JUnit5] Assertion

수수한개발자 2022. 7. 21.
728x90

 

assertEquals

 

study

 

public class Study {

    private StudyStatus studyStatus = StudyStatus.DRAFT;

    private int limit;
    
    public StudyStatus getStatus() {
        return this.studyStatus;
    }
   }

 

StudyTest

 

class StudyTest {

@Test
@DisplayName("스터디 만들기 ╯°□°)╯")
 void create_new_study() {
    Study study = new Study(-10);
    assertNotNull(study);
    //기대 값 왼쪽 나오는 값 오른 쪽이긴하나 상관없다.
 	assertEquals(StudyStatus.DRAFT, study.getStatus(), 
    () -> "스터디를 처음 만들면 상태값이 DRAFT여야 한다.");
}

 

assertEquals 를 사용하여 왼쪽에 기대값을 적고 오른쪽은 실제로 나오는 값을 넣어줍니다.

여기서는 상태값이 DRAFT였으면 하는 기대값이고 오르쪽에서 study.getSTatus를 하였을때도 DRAFT이기떄문에 true가 나옵니다. 

그리고 그 후에 람다식으로 에러메세지를 출력할 수 있습니다. 

여기서 람다식을 사용하는 이유는

 

assertEquals(StudyStatus.DRAFT, study.getStatus(),
               "스터디를 처음 만들면 상태값이 "+ StudyStatus.DRAFT + "여야 한다.");

 

이런 상태 였을때 이 부분은 StudyStatus.DRAFT 라는 연산 작업을 테스트가 실패하든 성공하든 무조건 하게 되어 있습니다. 하지만 람다식을 사용하여 실패했을때만 실행 되도록 해준 것입니다.

AssertJ를 하용하면 isEqualTo와 같은 의미이다.

 

assertAll

 @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보다 커야한다.")
);
}

 

테스트하는 부분을 assertAll (); 안에 다 넣고 테스트 할 수 있습니다.

 

assertThrows

 

study

public Study(int limit){
    if (limit < 0) {
        throw new IllegalArgumentException("limit은 0보다 커야 한다.");
    }
    this.limit = limit;
}

 

studyTest

 

    @Test
    @DisplayName("스터디 만들기 ╯°□°)╯")
    void create_new_study() {
        assertThrows(IllegalArgumentException.class, () -> new Study(-10));
        }

 

이런식으로 excetion.getMessage로 예외 메세지를 비교 할 수 있습니다.

 

여기서 study 클래스의 Illegal 예외 처리에서 던진 예외 메세지를 검증하고 싶으면 아래와 같이 하면 됩니다.

 

@Test
    @DisplayName("스터디 만들기 ╯°□°)╯")
    void create_new_study() {
        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> new Study(-10));
        String message = exception.getMessage();
        assertEquals("limit은 0보다 커야 한다.", exception.getMessage());
        }

 

assertTimeout

 

@Test
@DisplayName("스터디 만들기 ╯°□°)╯")
void create_new_study() {
    assertTimeout(Duration.ofMillis(100), () -> {
        new Study(10);
        Thread.sleep(300);
    });

 

100밀리세컨드안에 끝났으면 좋겠다는 기대값으로 시작을합니다. 하지만 쓰레드로 3밀리세컨드뒤에 지연시켰기때문에 

무조건 실패하게 됩니다. 그래서 테스트는 아래와 같이 실패가 됩니다.

 

351ms 가 나온 모습

 

이렇게 되면 어짜피 실패가 되기때문에 실패한 시점부터는 기다릴 필요가 없습니다. 

 

@Test
    @DisplayName("스터디 만들기 ╯°□°)╯")
    void create_new_study() {
        assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
            new Study(10);
            Thread.sleep(300);
        });

 

그럴때는 assertTimeoutPremmptively 를 사용하여 실패한 시점에서 테스트를 끝내 주도록 합니다.

 

 

하지만 assertTimeoutPremmptively  는 별도의 쓰레드에서 실행을 하기 때문에 예상치 못한 결과가 생길수도있다.

ThreadLocal은 다른 쓰레드와 공유가 안됩니다. JUnit은 기본적으로 쓰레드 로컬이기때문에 트랜잭션 설정이 반영이 안되어서 (스프링부트 테스트는 기본적적으로 롤벡을함) DB에 값이 들어가거나 삭제 되게 반영될수도있다. 이런점을 주의해서 사용해야한다.

728x90

'Spring Boot > JUnit5' 카테고리의 다른 글

[JUnit5] 테스트 순서  (0) 2022.07.22
[JUnit5] 테스트 인스턴스  (0) 2022.07.22
[JUint5] 테스트 반복하기  (0) 2022.07.22
[JUnit5] Assumptions  (0) 2022.07.21
[JUnit 5] JUit5  (0) 2022.07.21

댓글