본문 바로가기
✅ 테스트

JUnit5에서 검증문이 중간에 실패해도 멈추지 않고 검증문 모두 실행하기(AssertAll, AssertJ, SoftAssertions)

by kukim 2022. 6. 2.

상황

- JUnit5에서 하나의 테스트 코드에  N개의 검증문이 있다.

- 검증문 수행 중에 앞의 검증문이 실패하면 실패한 이후의 검증문은 실행되지 않는다.

 

해결

하나의 검증문이 실패해도 멈추지 않고 모든 성공/실패 내역을 확인하는 방법은 아래와 같다.

 

방법 1. Junit5의 assertAll() + JUnit5 검증문

// https://blog.codeleak.pl/2017/11/junit-5-meets-assertj.html

import static org.junit.jupiter.api.Assertions.assertAll;

List<String> owners = Arrays.asList("Betty Davis", "Eduardo Rodriquez");

// assert
assertAll(
    () -> assertTrue(owners.contains("Betty Doe"), "Contains Betty Doe"),
    () -> assertTrue(owners.contains("John Doe"), "Contains John Doe"),
    () -> assertTrue(owners.contains("Eduardo Rodriquez"), "Eduardo Rodriquez")
);

방법 2. AssertJ SoftAssertions + AssertJ 검증문 (추천)

import static org.assertj.core.api.Assertions.assertThat;
import org.assertj.core.api.SoftAssertions;

@Test
@DisplayName("요금을 계산한 상태를 가진 객체를 반환한다.")
void It_return_object() {
   ReservationPeriod reservationPeriod = new ReservationPeriod(
      LocalDateTime.of(2022, 6, 1, 0, 0),
      LocalDateTime.of(2022, 6, 3, 0, 0));
   RoomPriceInfo roomPriceInfo = RoomPriceInfo.of(50000, 5000, 3000, 10, 10);
   ReservationGuest reservationGuest = new ReservationGuest(2, 1, 1);

   RoomPrice roomPrice = RoomPrice.of(reservationPeriod, reservationGuest,
      roomPriceInfo);

   SoftAssertions softAssertions = new SoftAssertions();
   softAssertions.assertThat(roomPrice.getTotalOriginalPrice()).isEqualTo(100000L);
   softAssertions.assertThat(roomPrice.getSavedPrice()).isEqualTo(10000L);
   softAssertions.assertThat(roomPrice.getLodgingTax()).isEqualTo(300L);
   softAssertions.assertThat(roomPrice.getFixedTotalPrice()).isEqualTo(98300L);
   softAssertions.assertThat(roomPrice.getFixedDailyPrice()).isEqualTo(49150L);
   softAssertions.assertAll();
}

방법 3. JUnit5 assertAll() + AssertJ 검증문 (추천)

AssertJ의 검증문을 사용할 수 있고 한 번에 묶어 사용하는 문법중 간단한 assertAll()을 사용하는 방법 3을 추천한다.

import static org.junit.jupiter.api.Assertions.assertAll;
import static org.assertj.core.api.Assertions.assertThat;

@Test
@DisplayName("요금을 계산한 상태를 가진 객체를 반환한다.")
void It_return_object() {
   ReservationPeriod reservationPeriod = new ReservationPeriod(
      LocalDateTime.of(2022, 6, 1, 0, 0),
      LocalDateTime.of(2022, 6, 3, 0, 0));
   RoomPriceInfo roomPriceInfo = RoomPriceInfo.of(50000, 5000, 3000, 10, 10);
   ReservationGuest reservationGuest = new ReservationGuest(2, 1, 1);

   RoomPrice roomPrice = RoomPrice.of(reservationPeriod, reservationGuest,
      roomPriceInfo);


   assertAll(() -> assertThat(roomPrice.getTotalOriginalPrice()).isEqualTo(370368L),
      () -> assertThat(roomPrice.getSavedPrice()).isEqualTo(48147L),
      () -> assertThat(roomPrice.getLodgingTax()).isEqualTo(120L),
      () -> assertThat(roomPrice.getFixedTotalPrice()).isEqualTo(325341L),
      () -> assertThat(roomPrice.getFixedDailyPrice()).isEqualTo(108447L));
}

Reference

https://blog.codeleak.pl/2015/09/assertjs-softassertions-do-we-need-them.html

https://blog.codeleak.pl/2017/11/junit-5-meets-assertj.html

https://sun-22.tistory.com/86

댓글