unit test
[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..
Kotlin에서 Mockito ArgumentCaptor 사용시 java.lang.NullPointerException: argumentCaptor.capture() must not be null 나오는 현상 해결 방법
문제 상황 Kotlin에서 Mockito ArgumentCaptor을 사용하기 위해서 Java에서 쓰던 방법과 같은 방법을 사용하면 문제가 생긴다. @Test fun testLoginSuccessMockArgumentCaptor() { val repositorySuccessResult = LoginRepositoryResult.Success("test_token") Mockito.`when`(loginRepository.login(userName = "test", password = "test")) .thenReturn(repositorySuccessResult) val result = loginUseCase.logIn(userName = "test", password = "test") val argum..
IntelliJ, Android Studio에서 Test 결과를 시각적으로 확인하는 방법 : Gradle 사용
IntelliJ, Android Studio에서 테스트 결과 확인하기 IntelliJ와 Android Studio는 비슷한 테스트 리포트 탭을 가진다. 이 탭은 아래와 같은 화면으로 이루어져 있다. 이 탭에는 여러 버튼들이 있는데 여기서 원하는 테스트를 클릭한 후 Open Gradle test report를 클릭하면 테스트 결과 리포트를 확인할 수 있다. 저 버튼을 클릭하면 Gradle에서 생성한 테스트 리포트가 아래와 같이 나오게 된다. 테스트 결과 파일 경로 위 TestSummary는 보통 Chrome이 열리게 될텐데, 주소창을 보면 다음과 같은 경로에서 파일을 여는 것을 볼 수 있다. 즉, 위 Test Summary는 아래 경로에 생기는 파일을 여는 것임을 확인할 수 있다. [앱 경로]/[앱 명칭]..
Command Line에서 Test 실행하기 : Gradle Task 활용하기
Command Line에서 테스트 실행하기 Command Line에서 테스트를 실행하기 위해서는 Gradle에 미리 정의된 테스크를 사용하면 된다. Task의 명칭은 test 이다. 모든 테스트 수행하기 앱 내부에 작성된 모든 테스트를 수행하기 위해서는 :test 테스크를 사용하면 된다. gradlew :test 특정 클래스의 테스트들 전부 수행하기 특정 클래스의 테스트를 모두 수행하기 위해서는 :test의 --tests 파라미터로 "[패키지명].[클래스명]"을 넘기면 된다. ./gradlew :test --tests "[패키지명].[클래스명]" 아래의 Test중 lecture2/MinuteValidatorTest 클래스 내부의 테스트들을 수행한다고 해보자. 그럴 경우 아래 명령어를 사용하면 된다. 명령..