AssertJ

박지윤·2022년 8월 23일
0

Backend

목록 보기
7/12

JUnit : 자바를 위한 단위테스트를 지원해주는 프레임워크
assert 메소드로 테스트 케이스의 수행 결과를 판별한다.
@test 메소드가 호출될 때마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지게 한다.

AssertJ : JUnit의 테스트코드에 사용되는 라이브러리
많은 Assertion, 오류 메시지 테스트를 제공하고 테스트 코드 가독성을 향상시키며 쉽게 사용할 수 있도록 설계되었다.
테스트에 필요한 풍부한 메소드들을 제공한다

환경설정

  1. gradle dependency 추가
 testCompile("org.assertj:assertj-core:3.21.0")
  1. import 하기
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;

annotation

@test ➡️ 테스트를 수행할 메소드

@BeforeEach ➡️ 모든 테스트 실행 전에 실행할 테스트에 사용함

@AfterEach ➡️ 모든 테스트 실행 후에 실행한 테스트에 사용함

@DisplayName ➡️ 테스트 클래스 또는 메소드의 사용자 정의 이름을 선언할 때 사용함

@ParameterizedTest ➡️ 매개변수를 받는 테스트를 작성할 수 있음

@CsvSource ➡️ 인수 목록을 쉼표로 구분된 값으로 표현할 수 있음

  • ParameterizedTest 예제
@ParameterizedTest 
@ValueSource(ints = {1,2,3}) 
void containTest(int input) { 
    Assertions.assertTrue(numbers.contains(input)); 
}

인수로 1,2,3을 받아서 numbers라는 Set이 해당 인수를 포함하고 있는지 테스트한다.
@ParameterizedTest를 사용함으로써 중복되는 코드를 줄일 수 있다.

  • CsvSource 예제
@ParameterizedTest 
@CsvSource(value={"1:true","2:true","3:true","4:false","5:false"},delimiter =':') 
void setRequestTest3(int input,boolean output) { 
    Assertions.assertEquals(numbers.contains(input),output); 
}

인수를 사용자가 지정한 구분자(:)로 구분된 값으로 받아서 numbers라는 Set이 input값을 포함하고 있는지와 output의 값이 일치하는지 테스트한다.
구분자는 기본적으로 쉼표(,)인데, delimiter = ':' 처럼 사용자화가 가능하다.

assert 메소드

  • AssertJ에서 모든 테스트 코드는 assertThat()으로 시작한다.
  • assertThat(테스트 타겟).메소드1().메소드2().메소드3()'
    => 이런 포맷으로 AssertJ의 여러 메소드들을 연쇄적으로 호출해 코드를 작성할 수 있다(메소드 체이닝)
  1. assertThat
@Test 
public void split() { 
    String[] values = "1,2".split(","); assertThat(values).contains("1", "2"); values = "1".split(","); 
    assertThat(values).containsExactly("1"); 
}
  1. assertEquals(x, y)

객체 x와 y의 값이 일치함을 확인한다.
x(예상 값)와 y(실제 값)가 같으면 테스트 통과

@ParameterizedTest
@CsvSource(value={"1:true","2:true","3:true","4:false","5:false"},delimiter =':') 
    void setRequestTest3(int input,boolean output) { 
    Assertions.assertEquals(numbers.contains(input),output); 
}

➕ 자주 사용하는 메소드
assertTrue(a) ➡️ 조건 A가 참인가를 확인함

assertSame(a, b) ➡️ 객체 A와 B가 같은 객체임을 확인함

assertNotNull(a) ➡️ 객체 A가 null이 아님을 확인함

  • assertEquals 메소드는 두 객체의 값의 비교
  • assertSame 메소드는 두 객체가 동일한 객체인지 비교 (== 연산자와 같다)

AsserJ Exception

  1. assertThatThrownBy
@DisplayName("3-2. 잘못된 범위의 인덱스인 경우 예외확인") 
@Test void test(){ 
int index = 4; 
    assertThatThrownBy(() -> { 
    request3.charAt(index); })
   .isInstanceOf(StringIndexOutOfBoundsException.class)
    .hasMessageContaining("String index out of range: 4"); //에러메세지가 다음 값을 포함하고 있는지 검사함 
}
  1. assertThatExceptionOfType

Exception을 시작 시점에 특정할 수 있음

@Test 
public void test1() { 
    int index = 4; 
    assertThatExceptionOfType(IndexOutOfBoundsException.class) .isThrownBy(() -> { 
    request3.charAt(index); }).withMessage("String index out of range: 4"); 
}

➕ 자주 발생하는 Exception

자주 발생하는 Exception의 경우에는 Exception별로 메서드를 제공하고 있어, 다음과 같이 사용할 수 있다.

  • assertThatIllegalArgumentException()

  • assertThatIllegalStateException()

  • assertThatIOException()

  • assertThatNullPointerException()

0개의 댓글