본문 바로가기

Web/spring

[Spring] Assertions in JUnit 4 and JUnit 5

728x90

 

 

 

Assertions

Assertions은 테스트에서 해당 Assertion 조건을 지원해주는 메소드이다.

(JUnit 4의 Assert 클래스와 JUnit 5의 Assertions 클래스를 통해 액세스)

 

 

JUnit 5는 JUnit 4의 많은 어설션 메서드를 유지하면서 Java 8 지원을 활용하는 몇 가지 새로운 메서드를 추가했다.

 

JUnit4에도 있는 JUnit 5 어설션 부터 정리한다

 

 

 assertArrayEquals

예상배열과 실제 배열 동일 여부 확인

@Test
public void whenAssertingArraysEquality_thenEqual() {
    char[] expected = { 'J', 'u', 'p', 'i', 't', 'e', 'r' };
    char[] actual = "Jupiter".toCharArray();

    assertArrayEquals(expected, actual, "Arrays should be equal");
}

 

assertEquals

float 동일 여부 확인 예시

 

@Test
void whenAssertingEquality_thenEqual() {
    float square = 2 * 2;
    float rectangle = 2 * 2;

    assertEquals(square, rectangle);
}

 

미리 정의된 델타 값만큼 다른지 확인하려면 해당 델타  값을 세 번째 매개 변수로 전달하면 된다.

@Test
void whenAssertingEqualityWithDelta_thenEqual() {
    float square = 2 * 2;
    float rectangle = 3 * 2;
    float delta = 2;

    assertEquals(square, rectangle, delta);
}

 

 

assertTrue and assertFalse

제공 된 값이 true 인지 확인

@Test
void whenAssertingConditions_thenVerified() {
    assertTrue(5 > 4, "5 is greater the 4");
    assertTrue(null == null, "null is equal to null");
}

lambda expression 사용 가능

 

제공된 값이 false인지 확인

@Test
public void givenBooleanSupplier_whenAssertingCondition_thenVerified() {
    BooleanSupplier condition = () -> 5 > 6;

    assertFalse(condition, "5 is not greater then 6");
}

 

 

 

assertNull  assertNotNull

 

널이 아닌지

@Test
void whenAssertingNotNull_thenTrue() {
    Object dog = new Object();

    assertNotNull(dog, () -> "The dog should not be null");
}

 

널인지

@Test
public void whenAssertingNull_thenTrue() {
    Object cat = null;

    assertNull(cat, () -> "The cat should be null");
}

the failure message will be retrieved in a lazy way since it's a Supplier.

둘 다 실패 메세지는 Supplier 이므로 Lazy방식으로 검색된다

 

 

assertSame  assertNotSame

동일한 Object 를 참조하는지 확인할 때

@Test
void whenAssertingSameObject_thenSuccessfull() {
    String language = "Java";
    Optional<String> optional = Optional.of(language);

    assertSame(language, optional.get());
}

To achieve the opposite, we can use the assertNotSame one.

 

 

fail

The fail assertion fails a test with the provided failure message, as well as the underlying cause. This can be useful to mark a test when it's development isn't complete:

개발이 완료되지 않았을 경우 테스트를 표시할때 유용하다

@Test
public void whenFailingATest_thenFailed() {
    // Test not completed
    fail("FAIL - test not completed");
}

 

 

assertAll

JUnit 5 에서 새롭게 도입되었다.

모든 assertion 을 실행시키고 실패여부를 확인할 수 있는 그룹화 assertion이다

MultipleFailureError 및 실행 파일 Stream에 대한 메세지 문자열을 허용한다

@Test
void givenMultipleAssertion_whenAssertingAll_thenOK() {
    Object obj = null;
    assertAll(
      "heading",
      () -> assertEquals(4, 2 * 2, "4 is 2 times 2"),
      () -> assertEquals("java", "JAVA".toLowerCase()),
      () -> assertNull(obj, "obj is null")
    );
}

실행 파일 중에 하나가 예외를 발생시킬 경우 Assertion grouping 실행이 중단된다

 

 

assertIterableEquals

assertIterableEquals 는 예상하는 iterable 과 실제 iterable이 동일한지 확인한다

 

동일의 기준은 동일한 순서, 동일한 요소를 반환해야한다. (동일한 유형일 필요는 없다)

@Test
void givenTwoLists_whenAssertingIterables_thenEquals() {
    Iterable<String> al = new ArrayList<>(asList("Java", "Junit", "Test"));
    Iterable<String> ll = new LinkedList<>(asList("Java", "Junit", "Test"));

    assertIterableEquals(al, ll);
}

assertArrayEquals 와 같은 방식으로 두 iterable이 모두 null이면 동일한 것으로 확인한다

 

 

 

assertLinesMatch

The assertLinesMatch 는 문자열 리스트와 실제 리스트의 일치를 확인한다

 

각 쌍에 대해 알고리즘을 수행하기 때문에 assertEquals, assertIterableEquals와 다르다

 

  1. 실제 각 Line이 같은지 확인 한다. 한줄 한줄 매치시켜서 확인한다는 뜻
  2. 각 라인마다 정규식 취급하여 String으로 검사를 수행한다한다. 
  3. String.matches() 메서드로 검사하고 fast-forward marker로 확인한다.

Let's see how we can use this assertion to assert that two lists of String have matching lines:

@Test
void whenAssertingEqualityListOfStrings_thenEqual() {
    List<String> expected = asList("Java", "\\d+", "JUnit");
    List<String> actual = asList("Java", "11", "JUnit");

    assertLinesMatch(expected, actual);
}

 

assertNotEquals

assertEquals 와 반대로 예상 값과 실제 값이 다른지 확인한다

 

@Test
void whenAssertingEquality_thenNotEqual() {
    Integer value = 5; // result of an algorithm
    
    assertNotEquals(0, value, "The result cannot be 0");
}

둘 다 null 값이라면 실패라고 뜬다.

 

 

assertThrows

assertThrows 는 실행 파일이 지정된 예외 유행을 발생시키는지 확인할 수 있다

throw된 예외가 맞게 예외처리 되는지 확인한다

@Test
void whenAssertingException_thenThrown() {
    Throwable exception = assertThrows(
      IllegalArgumentException.class, 
      () -> {
          throw new IllegalArgumentException("Exception message");
      }
    );
    assertEquals("Exception message", exception.getMessage());
}

예외가 발생하지 않거나, 다른 유형의 예외이면 실패로 뜬다

 

 

assertTimeout and assertTimeoutPreemptively

제공된 excutable 실행이 Timeout 값 이전에 종료되는지 확인한다

@Test
void whenAssertingTimeout_thenNotExceeded() {
    assertTimeout(
      ofSeconds(2), 
      () -> {
        // code that requires less than 2 minutes to execute
        Thread.sleep(1000);
      }
    );
}

assertTimeout 을 사용하면 호출 코드와 동일한 스레드에서 실행된다

제한 시간이 초과된다고 실행이 중단되는 것은 아니다

만약 제한 시간이 초과됐을 때 중단을 시키려면 assertTimeoutPreemptively 코드를 사용한다

 

두 주장 모두 Executable 대신 ThrowingSupplier 를 allow할 수 있고,

개체를 반환하고 잠재적으로 throwable을 throw할 수 있는 코드블록으로 나타낼 수 있다

 

 

 

728x90