실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기

Ch01. 도서관리 애플리케이션 리팩토링 준비하기 - JUnit5 사용하기

webmaster 2022. 10. 29. 18:11
728x90

필수 사용 어노테이션

위 그림과 같은 순서로 어노테이션 실행된다.

class JunitTest {

    companion object { //스텍틱 함수

        @BeforeAll
        @JvmStatic
        fun beforeAll(){
            println("모든 테스틑 시작 전")
        }

        @AfterAll
        @JvmStatic
        fun afterAll(){
            println("모든 테스트 종료 후")
        }
    }

    @BeforeEach
    fun beforeEach() {
        println("각 테스트 시작 전")
    }

    @AfterEach
    fun afterEach() {
        println("각 테스트 종료 후")
    }

    @Test
    fun test1() {
        println("테스트 1")
    }

    @Test
    fun test2() {
        println("테스트 2")
    }
}
  • @Test : 테스트 메서드를 지정한다. 테스트 메서드를 실행하는 과정에서 오류가 없으면 성공!
  • @BeforeEach : 각 테스트 메서드가 수행되기 전에 실행되는 메서드를 지정한다.
  • @AfterEach : 각 테스트가 수행된 후에 실행되는 메서드를 지정한다.
  • @BeforeAll : 모든 테스트를 수행하기 전에 최초 1회 수행되는 메서드를 지정한다.
    • 코틀린에서는 static 메서드가 없으므로, @JvmStatic 어노테이션을 붙여 주어야 한다.
  • @AfterAll : 모든 테스트를 수행한 후, 최후 1회 수행되는 메서드를 지정한다(위와 같이 @JvmStatic 어노테이션 필수)

JUnit을 사용하도록 변경하기

import org.assertj.core.api.AssertionsForInterfaceTypes.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows

class JunitCalculatorTest {

    @Test
    fun addTest() {
        //given
        val calculator = Calculator(5)

        //when
        calculator.add(3)

        //then
        assertThat(calculator.number).isEqualTo(8) //단언문
    }

    @Test
    fun minusTest() {
        //given
        val calculator = Calculator(5)

        //when
        calculator.minus(3)

        //then
        assertThat(calculator.number).isEqualTo(2)
    }

    @Test
    fun multiplyTest() {
        //given
        val calculator = Calculator(5)

        //when
        calculator.multiply(3)

        //then
        assertThat(calculator.number).isEqualTo(15)
    }

    @Test
    fun divideTest() {
        //given
        val calculator = Calculator(5)

        //when
        calculator.divide(2)

        //then
        assertThat(calculator.number).isEqualTo(2)
    }

    @Test
    fun divideExceptionTest(){
        //given
        val calculator = Calculator(5)

        //when & then
        /*
        val message = assertThrows<IllegalArgumentException> {
            calculator.divide(0)
        }.message
        assertThat(message).isEqualTo("0으로 나눌 수 없습니다.")
         */
        val message = assertThrows<IllegalArgumentException> {
            calculator.divide(0)
        }.apply {
            assertThat(message).isEqualTo("0으로 나눌 수 없습니다.")
        }
    }
}
  • 메서드 단위로 테스트 실행이 가능해지고, 클래스 단위로 테스트를 진행할 수도 있다.
  • assertThat이라는 단언문이 등장하는데, 단언문은 assertThat(확인하고 싶은 값) , 뒤에 isEqualTo(기댓값)/ isTrue() 등 메서드가 붙게 된다.
    • isTrue(), isFalse() : 주어진 값이 true/false인지 검증한다.
    • hasSize() : 주어진 컬렉션이 size가 원하는 값인지 검증한다.
    • .extracting("프로퍼티").containExactlyInAnyOrder() : 컬렉션 안의 item 중 프로퍼티 추출 후, 값을 검증한다(순서 상관 x)
    • .extracting("프로퍼티").containExactly() :컬렉션 안의 item 중 프로퍼티 추출 후, 값을 검증한다(순서 상관 o)
    •  assertThrows<T>{ function1() } : 함수(function1)를 실행했을 때 원하는 예외가 나오는지 검증한다.
      • 예외 메시지 까지 검증할 수 있다
  • divideTest에서 .apply를 통해 바로 단언문을 실행할 수도 있다.
728x90