unit testing
[Unit Testing] 어떤 클래스에 테스트가 필요할까? data class 도 테스트가 필요한가?
테스트는 어떤 클래스에 필요할까? 객체 지향 언어에서 클래스는 데이터만을 저장하는 클래스, 동작을 포함하는 클래스 두가지 종류로 나뉜다. 예를 들어 Java의 경우는 일반적인 클래스와 POJO 클래스가 있다. Kotlin의 경우는 데이터만을 저장하는 클래스와 동작이 포함된 클래스가 있다. 프로그래밍에서는 데이터만을 저장하는 클래스를 '데이터 구조' 라 부르고 동작을 포함하는 클래스를 '객체'라 부른다. Unit Testing에서의 Unit은 특정한 책임을 가지고, 명확히 정의된 역할을 가진 것이다. 이는 바로 '객체'를 뜻한다. 즉, Unit Testing의 대상은 객체이지 데이터 구조가 아니다. 따라서 테스트가 필요한 클래스는 동작을 포함하는 클래스인 객체이다. Kotlin의 data class는 테스..
[JUnit] Unit Testing을 깔끔하게 작성하는 방법 : 테스트 이름 작성 방법, 코드 순서 작성 방법
Unit Testing 깔끔하게 작성하기 Unit Testing을 깔끔하게 작성하기 위해서는 Unit Test의 이름, 테스트 내부의 작성 순서가 중요하다. 이름 작성 방법 가독성을 좋게 만들려면 [메서드명][결과][환경 설명] 순서로 작성한다. 예를 들어 LoginRepository에서 Login이 Success했을 때, LoginUseCase의 login이 Success 해야 한다면 [login][Success][WhenLoginRepositoryLoginSuccess]와 같이 같이 테스트 이름이 작성될 수 있다. @Test fun loginSuccessWhenLoginRepositoryLoginSuccess() { val repositorySuccessResult = LoginRepositoryRe..
[Unit Testing] Android의 정적 메서드를 사용하거나 Android 전용 클래스를 사용하면 테스트에 실패하는 이유 알아보기
Unit Test와 Android Framework Android 개발자들에게 Test가 어렵게 다가오는 이유 중 하나는 안드로이드에서는 조금만 잘못해도 테스트가 실패하기 때문이다. 이번 글에서는 대부분의 안드로이드 개발자들이 겪는 안드로이드에서 테스트가 실패하는 이유 두가지와 해결 방법에 대해 알아볼 것이다. 안드로이드에서 테스트가 실패하는 케이스 안드로이드에서 안드로이드로 인해 테스트가 실패하는 케이스는 두가지이다. 바로 안드로이드에서 제공하는 정적 메서드를 사용하는 경우와, 안드로이드 전용 클래스를 사용하는 경우이다. 이들 각각에 대한 테스트를 작성해보고 왜 실패하는지 이유와 해결책을 알아보자. 안드로이드에서 제공하는 정적 메서드 테스트 해보기 예를 들어 유저가 가입할 때 id가 유효한지를 확인하는..
[Unit Testing] Android Context 객체를 사용하는 클래스 테스트하기
Android와 Context 객체 Android에서 Context 객체는 God Object(신 객체)이다. Context 내에는 무수히 많은 책임과 메서드가 있다. 이 때문에 많은 개발들이 만약 context 객체가 있다면 테스트 하기 어렵다고 생각한다. 하지만 이는 틀렸다. Context 자체를 테스트 하는건 어렵지만, Context를 포함하는 객체를 테스트 하는 것은 가능하다. 아래에서 리소스를 가져오는 클래스인 ResourceRetriever 클래스를 사용해 Context를 테스트 하는 방법에 대해 살펴보도록 하자. 테스트 환경 설정 예를 들어 아래와 같은 ResourceRetriever 클래스가 있다고 해보자. 이 클래스는 안드로이드에서 리소스를 가져오는 역할을 한다. class Resourc..
MockitoJUnitRunner 사용해 Mockito 코드 깔끔하게 만들기 : @Mock
이전 테스트 이전 시간에 다음과 같은 테스트를 작성했다. setUp에서 Mockito.mock 메서드를 사용해 loginRepository를 Mock 객체로 초기화 시켰는데, 여기서는 LoginUseCase에 대한 의존성이 하나만 있어서 한 줄로 Mocking이 끝났다. class LoginUseCaseTest { private lateinit var loginUseCase: LoginUseCase private lateinit var loginRepository: LoginRepository @Before fun setUp() { loginRepository = Mockito.mock(LoginRepository::class.java) loginUseCase = LoginUseCase(loginRepo..