JUnit : 자바를 위한 단위테스트를 지원해주는 프레임워크
assert 메소드로 테스트 케이스의 수행 결과를 판별한다.
@test 메소드가 호출될 때마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지게 한다.
AssertJ : JUnit의 테스트코드에 사용되는 라이브러리
많은 Assertion, 오류 메시지 테스트를 제공하고 테스트 코드 가독성을 향상시키며 쉽게 사용할 수 있도록 설계되었다.
테스트에 필요한 풍부한 메소드들을 제공한다
testCompile("org.assertj:assertj-core:3.21.0")
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
@test ➡️ 테스트를 수행할 메소드
@BeforeEach ➡️ 모든 테스트 실행 전에 실행할 테스트에 사용함
@AfterEach ➡️ 모든 테스트 실행 후에 실행한 테스트에 사용함
@DisplayName ➡️ 테스트 클래스 또는 메소드의 사용자 정의 이름을 선언할 때 사용함
@ParameterizedTest ➡️ 매개변수를 받는 테스트를 작성할 수 있음
@CsvSource ➡️ 인수 목록을 쉼표로 구분된 값으로 표현할 수 있음
@ParameterizedTest
@ValueSource(ints = {1,2,3})
void containTest(int input) {
Assertions.assertTrue(numbers.contains(input));
}
인수로 1,2,3을 받아서 numbers라는 Set이 해당 인수를 포함하고 있는지 테스트한다.
@ParameterizedTest를 사용함으로써 중복되는 코드를 줄일 수 있다.
@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 = ':' 처럼 사용자화가 가능하다.
@Test
public void split() {
String[] values = "1,2".split(","); assertThat(values).contains("1", "2"); values = "1".split(",");
assertThat(values).containsExactly("1");
}
객체 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이 아님을 확인함
@DisplayName("3-2. 잘못된 범위의 인덱스인 경우 예외확인")
@Test void test(){
int index = 4;
assertThatThrownBy(() -> {
request3.charAt(index); })
.isInstanceOf(StringIndexOutOfBoundsException.class)
.hasMessageContaining("String index out of range: 4"); //에러메세지가 다음 값을 포함하고 있는지 검사함
}
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()