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와 다르다
- 실제 각 Line이 같은지 확인 한다. 한줄 한줄 매치시켜서 확인한다는 뜻
- 각 라인마다 정규식 취급하여 String으로 검사를 수행한다한다.
- 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할 수 있는 코드블록으로 나타낼 수 있다
'Web > spring' 카테고리의 다른 글
[Task Execution and Scheduling] TaskExecutor (0) | 2023.11.21 |
---|---|
JPA 프레임워크의 개념과 구조 (0) | 2023.11.12 |
[Spring] A Spring Custom Annotation for a Better DAO (0) | 2023.04.24 |
[Spring] Testing @Cacheable on Spring Data Repositories (1) | 2023.04.24 |
[Spring Test] (0) | 2023.04.22 |