테스트는 어떤 클래스에 필요할까?
객체 지향 언어에서 클래스는 데이터만을 저장하는 클래스, 동작을 포함하는 클래스 두가지 종류로 나뉜다. 예를 들어 Java의 경우는 일반적인 클래스와 POJO 클래스가 있다. Kotlin의 경우는 데이터만을 저장하는 클래스와 동작이 포함된 클래스가 있다.
프로그래밍에서는 데이터만을 저장하는 클래스를 '데이터 구조' 라 부르고 동작을 포함하는 클래스를 '객체'라 부른다. Unit Testing에서의 Unit은 특정한 책임을 가지고, 명확히 정의된 역할을 가진 것이다. 이는 바로 '객체'를 뜻한다. 즉, Unit Testing의 대상은 객체이지 데이터 구조가 아니다. 따라서 테스트가 필요한 클래스는 동작을 포함하는 클래스인 객체이다.
Kotlin의 data class는 테스트 대상인가?
오해하지 말아야 할 것은 data class도 테스트 대상이 될 수 있다는 것이다.
data class이더라도 만약 동작이 포함되어 있다면 테스트가 필요하다. 즉, class 앞에 붙은 sealed class, data class 등이 중요한 것이 아니라 '동작'이 포함되어 있는지 여부를 본다.
예를 들어 아래와 같은 data class Person는 introduceSelf 라는 외부에 공개된 동작을 가진다. 따라서 테스트 대상이다.
data class Person(val name: String) {
fun introduceSelf() : String {
return "My name is $name"
}
}
하지만 아래의 data class Person은 동작을 가지지 않으므로 테스트 대상이 아니다.
data class Person(val name: String)
간단하게 말하면 테스트가 필요한 클래스와 아닌 클래스를 구분하는 기준은 '동작'이 포함되어 있는지이다. '동작'이 포함되어 있다면 테스트를 진행해야 한다. 하지만 동작이 포함되어 있다고 모두 테스트가 가능한 것은 아니다.
테스트가 가능한 클래스와 불가능한 클래스
만약 해당 동작이 값이 매번 바뀌는 Static Variable(정적 변수)을 포함한다면 테스트는 의미가 없어진다. 또는 정적 메서드가 네트워크 요청을 실행하거나 하는데 테스트 대상 클래스의 동작에서 해당 메서드를 사용한다면 대체할 방법이 없어진다. 이외에도 동작에서 싱글톤 객체를 참조한다면 테스트가 의미가 없어질 수 있다.
이런 문제로 인해 실무에서는 최대한 정적인 변수, 메서드와 싱글톤 객체의 사용을 지양하는 편이다. 동작이 다른 의존성에 영향을 받지 않도록 디자인 하는 것이 매우 중요하다.
'Unit Testing' 카테고리의 다른 글
[JUnit] Unit Testing을 깔끔하게 작성하는 방법 : 테스트 이름 작성 방법, 코드 순서 작성 방법 (0) | 2022.12.27 |
---|---|
[Unit Testing] Android의 정적 메서드를 사용하거나 Android 전용 클래스를 사용하면 테스트에 실패하는 이유 알아보기 (0) | 2022.12.26 |
[Unit Testing] Android Context 객체를 사용하는 클래스 테스트하기 (0) | 2022.12.25 |
코드 작성 시 정적 변수와 정적 메서드 사용을 지양해야 하는 이유 알아보기 (0) | 2022.12.24 |
MockitoJUnitRunner 사용해 Mockito 코드 깔끔하게 만들기 : @Mock (0) | 2022.12.23 |