평소 테스트 코드르를 작성할 때 assertj 의 assertThat 을 주로 애용했는데 이번에 SoftAssertions 에 대해 알게되어 각각의 특징에 대해 알아보았다.
또 assertAll 과 AssertSoftly 의 차이점도 알아봤다.
@Test
void no1() {
    String nickname = "name";
    int age = 10;
    Member member = createMember(nickname, age);
    assertThat(member.getNickname()).isEqualTo(nickname);
    assertThat(member.getAge()).isEqualTo(age);
}
hasFieldOrPropertyWithValue 를 사용해 개선할 수 있다.@Test
void no1() {
    String nickname = "name";
    int age = 10;
    Member member = createMember(nickname, age);
    assertThat(member)
            .hasFieldOrPropertyWithValue("nickname", "nickname")
            .hasFieldOrPropertyWithValue("age", 30);
}
@Test
void no1() {
    String nickname = "name";
    int age = 10;
    boolean useAgreement = true;
    Member member = createMember(nickname, age, useAgreement);
    assertThat(member)
            .hasFieldOrPropertyWithValue("nickname", "nickname")
            .hasFieldOrPropertyWithValue("age", 30)
            .hasFieldOrPropertyWithValue("useAgreement", false);
}
java.lang.AssertionError: 
Expecting
to have a property or a field named "nickname" with value
  "nickname"
but value was:
  "name"
(static and synthetic fields are ignored)
@Test
void no1() {
    String nickname = "name";
    int age = 10;
    boolean useAgreement = true;
    Member member = createMember(nickname, age, useAgreement);
    assertSoftly(softly -> {
        softly.assertThat(member.getNickname()).isEqualTo(nickname);
        softly.assertThat(member.getAge()).isEqualTo(age);
        softly.assertThat(member.getUseAgreement()).isEqualTo(useAgreement);
    });
}
@Test
void no1() {
    String nickname = "name";
    int age = 10;
    boolean useAgreement = true;
    Member member = createMember(nickname, age, useAgreement);
    assertSoftly(softly -> {
        softly.assertThat(member.getNickname()).isEqualTo("nickname");
        softly.assertThat(member.getAge()).isEqualTo(age);
        softly.assertThat(member.getUseAgreement()).isEqualTo(false);
    });
}
org.assertj.core.error.AssertJMultipleFailuresError: 
Multiple Failures (2 failures)
-- failure 1 --
expected: "nickname"
 but was: "name"
at ... .java:20)
-- failure 2 --
expected: false
 but was: true
at ... .java:22)
hasFieldOrPropertyWithValue 를 사용해도 잘 작동된다@Test
void no1() {
    String nickname = "name";
    int age = 10;
    boolean useAgreement = true;
    Member member = createMember(nickname, age, useAgreement);
    assertSoftly(softly -> {
        softly.assertThat(member)
                .hasFieldOrPropertyWithValue("nickname", "nickname")
                .hasFieldOrPropertyWithValue("age", age)
                .hasFieldOrPropertyWithValue("useAgreement", false);
    });
}
org.assertj.core.error.AssertJMultipleFailuresError:
 
Multiple Failures (2 failures)
-- failure 1 --
Expecting
to have a property or a field named "nickname" with value
  "nickname"
but value was:
  "name"
(static and synthetic fields are ignored)
at ... .java:21)
-- failure 2 --
Expecting
to have a property or a field named "useAgreement" with value
  false
but value was:
  true
(static and synthetic fields are ignored)
at ... .java:23)
assertThat 을 사용AssertSoftly 를 사용hasFieldOrPropertyWithValue 를 사용