[kotlin] Hamcrest의 고급 테스트 코드 기법

Hamcrest는 Java 및 Kotlin과 같은 JVM 기반 언어에서 테스트 코드를 작성할 때 유용한 라이브러리 중 하나입니다. 기본 매처(matcher) 외에도 Hamcrest의 고급 테스트 코드 기법을 사용하여 테스트 코드를 더욱 유연하고 가독성 있게 작성할 수 있습니다.

이번 글에서는 Hamcrest의 고급 기법 중 몇 가지를 살펴보고자 합니다.

플루언트 매처(Fluent Matcher)

Hamcrest는 플루언트 인터페이스(Fluent Interface) 스타일의 매처를 제공합니다. 이 스타일의 매처는 메서드 체이닝을 통해 테스트 코드를 직관적으로 작성할 수 있도록 도와줍니다. 예를 들어, assertThat 구문을 사용하여 테스트 코드를 작성할 때 플루언트 매처를 활용할 수 있습니다.

assertThat(person, `is`(notNullValue())
    .and(hasProperty("name", equalTo("John"))
    .and(hasProperty("age", greaterThan(20)))
)

위의 예제에서는 assertThat 구문과 플루언트 매처를 사용하여 person 객체의 속성들을 검증하는 코드를 보여줍니다.

커스텀 매처(Custom Matcher)

Hamcrest를 사용하여 직접 커스텀 매처를 작성할 수 있습니다. 이를 통해 프로젝트 특정한 도메인에 맞는 매처를 작성하여 테스트 코드를 더욱 읽기 쉽고 유지보수하기 좋게 만들 수 있습니다.

class AgeMatcher(private val expectedAge: Int) : TypeSafeMatcher<Person>() {

    override fun matchesSafely(person: Person): Boolean {
        return person.age == expectedAge
    }

    override fun describeTo(description: Description) {
        description.appendText("person's age should be ").appendValue(expectedAge)
    }

    companion object {
        fun hasAge(expectedAge: Int): Matcher<Person> {
            return AgeMatcher(expectedAge)
        }
    }
}

위의 예제에서는 AgeMatcher를 작성하고, hasAge 메서드를 통해 테스트 코드에서 이를 사용하는 방법을 보여줍니다.

커스텀 매처를 활용한 테스트 코드

작성한 커스텀 매처를 활용하여 테스트 코드를 작성할 수 있습니다.

@Test
fun `person age test`() {
    val person = Person("John", 25)
    assertThat(person, hasAge(25))
}

위의 예제에서는 작성한 AgeMatcher를 활용하여 person 객체의 age 속성을 검증하는 테스트 코드를 보여줍니다.

Hamcrest의 고급 테스트 코드 기법을 활용하면 테스트 코드를 더욱 읽기 쉽고 유지보수하기 좋게 작성할 수 있습니다.

참고 자료