[Java JUnit5] (3) 실전준비. Assertions 단언문
이전 포스트에서 값을 검증할때 assertEquals을 사용하였다. 그래서 Assertions 단언문이 무엇인지 알아보고, 많이 사용되는 Assert method에 대해선 예제로 다루어 보기로 한다.
목차
- Assertion 메서드
- assertEquals(x, y)
- assertArrayEquals(a, b)
- assertFalse(x), assertTrue(x)
- assertAll(executables…)
- assertNotNull(o)
- assertSame(ox, oy), assertNotSame(ox, oy)
- 써드파티 Assertion 라이브러리
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)));
}
}