[kotlin] Hamcrest의 테스트 코드 트러블슈팅

Hamcrest는 자바 개발자들 사이에서 인기 있는 매처 라이브러리 중 하나입니다. 하지만 때로는 Hamcrest를 사용한 테스트 코드 작성 시 문제가 발생할 수 있습니다. 이 기술 블로그에서는 Hamcrest를 사용한 테스트 코드의 흔한 문제들과 그 해결책에 대해 알아보겠습니다.

문제: contains 매처로 리스트의 순서를 검증하는 테스트가 실패하는 경우

일반적으로 contains 매처를 사용하여 리스트에 특정 아이템이 포함되어 있는지를 검증할 수 있습니다. 그러나 순서도 함께 검증하도록 코드를 작성한 경우, 예상과 다르게 테스트가 실패할 수 있습니다.

import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.contains

val myList = listOf(1, 2, 3)
assertThat(myList, contains(1, 2, 4))

이 경우, contains 매처로는 순서까지 함께 검증할 수 없습니다. 대신에 Hamcrest의 containsExactly 매처를 사용해야 합니다.

import org.hamcrest.Matchers.containsExactly

assertThat(myList, containsExactly(1, 2, 4))

문제: 객체의 프로퍼티 값을 검증하는 테스트가 실패하는 경우

객체의 프로퍼티를 검증하기 위해 Hamcrest를 사용할 때, 특히 커스텀 타입이나 복잡한 객체를 다룰 때 문제가 발생할 수 있습니다. 일반적인 hasProperty 매처로는 원하는 결과를 얻을 수 없는 경우가 있습니다.

import org.hamcrest.Matchers.hasProperty

data class Person(val name: String, val age: Int)

val person = Person("Alice", 30)
assertThat(person, hasProperty("age", equalTo(25)))

이 경우, hasProperty은 프로퍼티의 값을 검증하기보다는 해당 프로퍼티를 가지고 있는지 검증하므로 실패할 수 있습니다. 대신에 Hamcrest의 hasProperty로 프로퍼티를 추출하고, 해당 프로퍼티에 대해 일반적인 매처를 사용하여 값을 검증해야 합니다.

assertThat(person.age, equalTo(25))

효과적인 방법은 객체를 추출하고, 프로퍼티에 대해 일반적인 매처를 사용하여 값을 검증하는 것입니다.

이렇게 Hamcrest를 사용하여 테스트 코드를 작성할 때 주의해야 할 점들이 있으며, 이러한 문제에 대한 효과적인 해결책들을 활용하면 테스트 코드의 안정성과 유지보수성을 높일 수 있습니다.

참고 문헌: