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의 고급 테스트 코드 기법을 활용하면 테스트 코드를 더욱 읽기 쉽고 유지보수하기 좋게 작성할 수 있습니다.