2 minute read

이전 포스트에서 값을 검증할때 assertEquals을 사용하였다. 그래서 Assertions 단언문이 무엇인지 알아보고, 많이 사용되는 Assert method에 대해선 예제로 다루어 보기로 한다.

목차

  1. Assertion 메서드
  2. assertEquals(x, y)
  3. assertArrayEquals(a, b)
  4. assertFalse(x), assertTrue(x)
  5. assertAll(executables…)
  6. assertNotNull(o)
  7. assertSame(ox, oy), assertNotSame(ox, oy)
  8. 써드파티 Assertion 라이브러리

11. assertfail()

1. Assertion

JUnit 5의 단언문 Assertion 메소드를 사용해서 테스트에서 검증하고자하는 내용을 확인하는 기능이다.

2. assertEquals(x, y)

실제값과 기대한 값이 같은지를 확인한다.

@Test
void standardAssertions() {
    assertEquals(2, calculator.add(1, 1));
    assertEquals(4, calculator.multiply(2, 2),
            "추가적인 실패 메세지는 마지막 파라미터에 넣는다.");
}

3. assertArrayEquals(a, b)

두 배열이 같은지 확인한다.

@Test
public void test_assertArrayEquals1() {
    
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();
    assertArrayEquals(expected,actual);
//        assertArrayEquals("실패 시 표시",expected,actual);
}

@Test
public void test_assertArrayEquals2() {

    // 두 배열이 모두 null 인 경우 같은 배열로 간주 한다. 
    int[] expected = null;
    int[] actual = null;
    assertArrayEquals(expected, actual);
}

4. assertFalse(x), assertTrue(x)

일반적으로 assertTrue, assertFalse 메소드는 boolean 값을 리턴하는 메소드를 테스트하기에 적합하다.

@Test
    public void testIsInteger() {
        // 케이스 1. 정수를 담은 문자열이 정수인지 시험
        assertTrue(Example.isInteger("12345"));

        // 케이스 2. 정수를 담지 않은 문자열이 정수인지를 시험
        assertFalse(Example.isInteger("ABCDE"));
        assertFalse(Example.isInteger("123L"));
        assertFalse(Example.isInteger("123.456"));
        assertFalse(Example.isInteger("123.4567f"));
    }

5. assertAll(executables…)

모든 구문을 확인합니다. (기본적으로 예외 발생 시 더이상 실행이 되지 않습니다.)

@Test
void groupedAssertions() {
    assertAll("person",
            () -> assertEquals("Jane", person.getFirstName()),
            () -> assertEquals("Doe", person.getLastName()));
}

@Test
void assertAllTest() {
    Start start = new Start(1);
    assertAll(
            () -> assertEquals(Status.STARTED, start.getStatus(), "상태가 맞지 않습니다."),
            () -> assertNotNull(start),
            () -> System.out.println("모든 구문을 확인합니다."),
            () -> assertTrue(start.getLimit() > 0)
    );
}

6. assertNotNull(o)

값이 null이 아닌지 확인한다.

public class SampleTest {
    String test1;
    String[] test2;
    List<String> test3;
    Person person;
    String test4;
 
    @BeforeEach
    public void setUp(){
         test1 = "hello";
         test2 = new String[]{"1", "2"};
         test3 = Arrays.asList("가","나","다");
         person = new Person("lee",12);
    }
 
 
    @Test
    public void test_assertNotNull(){
        // 기본타입, 배열, 컬렉션, 참조타입 모두 테스트 가능
        assertNotNull(test1);
        assertNotNull(test2);
        assertNotNull(test3);
        assertNotNull(person);
    }
 
    @Test
    public void test_assertNull(){
        assertNull(test4);
    }
}

7. assertSame(ox, oy), assertNotSame(ox, oy)

assertEquals이 두 값이 같은지를 비교하는 단정문이였다면, assertSame은 두 객체가 동일한 객체인지 __주소값__으로 비교하는 단정문이다. assertSame은 싱글톤(Singleton) 패턴으로 만들어진 객체를 비교확인하기도 하고 리스트의 clone 메소드로 복사된 객체를 비교할 수도 있다.

@Test
void assertSameTest() {
    assertSame("aa", "aa");
    assertSame(12, 12);

    assertSame(new Integer("12"), new Integer("12")); // false

    ArrayList<String> list = new ArrayList<>();
    ArrayList<Integer> copy = (ArrayList<Integer>) list.clone();
    assertSame(list, list) // success
    assertNotSame(list, copy);  // success
}

8. 써드 파티 Assertion 라이브러리

JUnit Jupiter가 제공하는 assertion이 많은 테스트 시나리오에 모두 맞춰 사용하기엔 부족할수 있다. 이러한 경우 Junit팀은 AssertJ, Hamcrest, Truth 등 써드 파티 라이브러리를 쓰는걸 추천한다.

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

public class HamcrestAssertionsTest {

private final Calculator calculator = new Calculator();

    @Test
    void HamcrestMatcher_이용하기() {
        assertThat(calculator.subtract(4, 1), is(equalTo(3)));
}
}

Categories:

Updated: