상황
- 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
'✅ 테스트' 카테고리의 다른 글
Testcontainers에서 MySQL 사용해보기 (테스트 환경에서 자동으로 MySQL 컨테이너 띄우고 내리기) (1) | 2022.06.23 |
---|---|
[의사결정] Testcontainers 사용하기까지 (0) | 2022.06.21 |
단위 테스트란 무엇일까? 런던파와 고전파의 차이점 🆚 (2) | 2022.03.19 |
IntelliJ의 Code&Live Templates 활용하여 생산성 높이기! 테스트코드 작성시간 줄이고 아직 구현하지 않은 메서드 예외로 확인하기 (0) | 2022.03.10 |
private 메서드도 테스트를 해야 할까? (private 메서드 테스트 하고 싶을 때...) ✅ 👃 (7) | 2022.02.16 |
댓글