data class Member(
private val id: String,
private val name: String,
private val point: Int
)
위와 같은 Member 클래스가 있다고 가정해 봅시다. 필드들은 모두 private이어서 외부에서 직접 접근은 불가능합니다. 그런데 유닛 테스트를 진행하기 위해서는 private 필드들에 접근할 수 있어야 합니다. 이 때 필요한 것이 바로 reflection입니다. 이를 이용하여 클래스의 정보를 알 수 있고, 클래스의 일부 필드나 함수의 접근 제한을 풀 수 있습니다.
아래 코드는 Member 객체를 정의하고 그것의 id 필드를 테스트하는 코드입니다. Member::class.java.declaredFields를 통해 Member 클래스의 필드들에 접근할 수 있고, id 필드의 접근 제한을 푼 후 id 값을 체크합니다. first { ... }는 { ... } 조건을 만족하는 첫번째 필드를 구합니다. 필드 객체들 중 이름(name)이 "id"인 것을 찾구요. 찾는데 성공했다면, 그것의 isAccesible을 true로 설정하여 Member 객체의 id 필드 접근이 가능해집니다. 해당 필드 객체의 get(대상객체) 함수를 호출하여 id 값을 읽을 수 있습니다. 대상객체에는 Member 객체를 대입하면 됩니다.
class TempTest {
@Test
fun testPerson() {
val john = Member("smartjohn", "John", 10000)
Member::class.java.declaredFields.first { field ->
field.name == "id"
}?.let { field ->
field.isAccessible = true
val id = field.get(john)
Assert.assertEquals("smart_john", id)
}
}
}
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit