[Unit Testing] Android Context 객체를 사용하는 클래스 테스트하기
·
Unit Testing
Android와 Context 객체 Android에서 Context 객체는 God Object(신 객체)이다. Context 내에는 무수히 많은 책임과 메서드가 있다. 이 때문에 많은 개발들이 만약 context 객체가 있다면 테스트 하기 어렵다고 생각한다. 하지만 이는 틀렸다. Context 자체를 테스트 하는건 어렵지만, Context를 포함하는 객체를 테스트 하는 것은 가능하다. 아래에서 리소스를 가져오는 클래스인 ResourceRetriever 클래스를 사용해 Context를 테스트 하는 방법에 대해 살펴보도록 하자. 테스트 환경 설정 예를 들어 아래와 같은 ResourceRetriever 클래스가 있다고 해보자. 이 클래스는 안드로이드에서 리소스를 가져오는 역할을 한다. class Resourc..
코드 작성 시 정적 변수와 정적 메서드 사용을 지양해야 하는 이유 알아보기
·
Unit Testing
Static Variable과 Static Method 정적인 변수와 메서드는 한 번 선언 해놓으면 이곳 저곳에서 모두 사용할 수 있기 때문에 매우 편리하게 사용될 수 있다. 하지만, 시스템적으로 보았을 때 정적인 변수와 메서드는 최대한 지양하는 것이 좋다. 정적인 변수와 메서드를 참조 하는 클래스가 늘어난다는 것은 정적 변수와 메서드에 의존성이 생긴다는 것을 뜻한다. 이는 프로그램이 작을 때는 문제가 없지만 프로그램이 커지면 커질 수록 큰 문제로 번진다. 특히 정적 변수는 해당 변수가 여러 클래스에서 공유되게 될 경우 해당 클래스들이 서로가 서로에게 의존성이 생기는 것을 의미한다. 정적 메서드의 경우 정적 변수를 참조하지 않으면 그나마 낫지만, 정적 변수를 참조하지 않더라도 테스트 시에 문제가 생길 가..
MockitoJUnitRunner 사용해 Mockito 코드 깔끔하게 만들기 : @Mock
·
Unit Testing
이전 테스트 이전 시간에 다음과 같은 테스트를 작성했다. 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..
Kotlin에서 Mockito ArgumentCaptor 사용시 java.lang.NullPointerException: argumentCaptor.capture() must not be null 나오는 현상 해결 방법
·
Unit Testing
문제 상황 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..
[Mockito] ArgumentCaptor 사용해 객체의 interaction 기록하기
·
Unit Testing
ArgumentCaptor 란? ArgumentCaptor란 interaction을 기록하는 Mock 타입의 Test Double을 만드는 객체이다. 즉, ArgumentCaptor은 객체의 interaction을 기록한다. ArgumentCaptor 사용하기 위한 환경 설정 ArgumentCaptor을 사용하기 위해서 앞선 글 https://simcode.tistory.com/12 의 환경을 가져와서 LoginUseCase, LoginUseCaseResult, LoginRepository, LoginRepositoryResult를 사용한다. 환경 설정 부분을 읽도록 하자. ArgumentCaptor 사용한 테스트 만들기 LoginUseCase의 logIn메서드에서 userName과 password변형이..