본문 바로가기

kotlin

(14)
[Testing/Unit-test] Context를 포함하는 ViewModel의 Unit Test Problem 유닛테스트를 신규로 도입하게 되면 Testable 하지 않은 프로젝트 코드들과 마주하게 될 때가 있다. 아마 가장 손쉽게 맞닥뜨리게 되는 이슈는 Context를 인자로 받는 ViewModel일 것이다. ViewModel이 Context를 포함해야 하느냐는 논의에 앞서 , 기존 코드를 건드리지 않은 채 테스트 커버리지를 확보하는 방법에 대해 짧게 정리하려 한다. Environments - Kotlin 1.5.21 - Koin 3.1.2 - Mockito 4.2.0 Soluton 1. Context를 Mockito를 사용해 Mock 한다. @Mock lateinit var mockedContext: Context 2. Mocking한 context로부터 필요로 하는 사항에 대한 상세사항을 추가..
[Kotlin/UnitTesting] LiveData Mocking하기 유닛 테스트를 신나게 적용하다 보면, 검증해야 하는 변수나 결과가 LiveData와 맞물려 들어가는 로직과 맞닥뜨릴 수 있다. 여기서 특정 결과값이 특정 LiveData를 Observing하는 방식으로 도출된다면, Mocking하는 것도 쉽지 않을 것이다. 이런 케이스를 해결하기 위해 실 Stub LiveData를 만들어 초기값을 넣어줌으로써, 본래 수행하려던 테스트 케이스를 성공적으로 돌릴 수 있었다! 사용 예를 남기고자 Pizza라는 data class를 담는 LiveData를 예시로 테스트 코드를 작성해보겠다. 테스트 환경은 아래와 같다. Mockito LiveDataTesting https://github.com/jraska/livedata-testing Koin DI Coroutine Clean..
[Kotlin] 컬렉션의 lazy 연산을 짚어보자 (Sequence) 코틀린에서는 다양한 형태로 시퀀셜하게 결과값을 이어나가는 코딩이 가능하다. 문제는 컬렉션을 베이스로 시퀀셜하게 코드 블럭을 잇는 경우, 이에 대한 결과값들이 연산 이후마다 만들어지기 때문에 (우리는 최종적인 값만을 필요로 함에도 불구하고) 메모리적으로 비효율 적이라 할 수 있다. (특정 컬렉션에 사용하는 조건이 다양하고 많을 수록 받는 영향은 클 것이다) 이를 위해 코틀린은 Sequence를 제공하고 있는데, 컬렉션에 이를 사용하는 경우 호출 원본 리스트에서 이어진 시퀀셜한 모든 연산을 뒤로 이를 toList 등으로 추출하기 이전까지 어떠한 임시 컬렉션 변수를 생성하지 않는다는 것이다! 방법은 간단한데, 보통 사용하던 컬렉션 API 사용에 앞서 원본 리스트에 asSequence()를 호출하고 사용하는 것..
[Kotlin] 컬렉션 함수형 API로 컬렉션 쉽게 갖고 놀기 개발을 하다 보면 리스트형 변수와 필연적으로 마주하게 되는데, 단순히 이런 컬렉션 객체를 사용하는 것에서 넘어 특정한 조건에 따라 필터링을 한 목록을 얻는다던지, 검색한 모든 결과값에서 원하는 결과가 있는지 확인한다던지 하는 요구사항을 필요로 한 적이 있을 것이다. 코틀린을 사용할 때, 이러한 요구사항을 손쉽게 충족해주는 API를 정리해보고자 한다! 컬렉션 함수형 API 우선 Kotlin in Action에서 소개하는 함수 중 필수적인 함수로 소개하는 filter와 map에 대해 살펴보자. filter filter를 사용하는 경우, 호출하는 대상 컬렉션으로부터 필요한 조건을 filter 코드 블럭에 선언하면 조건에 맞는 List로 이를 반환하게 된다. val targetList = listOf("윤철수"..
[안드로이드] 람다 Function을 파라미터로 가지는 로직의 Unit Testing! 자바에서 코틀린으로 넘어오면서 람다 식은 이제 부수적으로 쓴다기보단 항상 쓰게되는 부분 중에 하나가 되었다. 람다식을 단순히 이용할 때엔 간결하고 쉽게 사용이 가능하지만, 유닛 테스팅에 사용할 때, 특히 람다 Function을 파라미터로 포함한 function을 테스트해야 될 때는 이를 어떻게 Mock 해야 하는지, 가능은 한지에 대해서 머리를 싸매고 있었다. 결국에 개발이란 안 되는 건 없고, 방법을 찾지 못한 것이라는 말이 사실이었던 걸까, 방법은 있었다. mockito의 when 문을 이용해서 특정 function을 call 할때와, 이를 call 한 경우의 동작을 정의할 수 있는 것이었다. 방식은 아래와 같다. 우선 아래와 같은 클래스와 function을 예로 들어보겠다. class sampleC..
[Kotlin] Default Argument와 Named Argument 활용하기 개발을 하게 되면서 일상적으로 마주하는 상황 중에 변수들을 넘겨주기 위한 클래스나 메소드를 설계하고, 이를 활용해야 할 때가 있다. 코틀린은 이런 상황에서 개발자가 그저 설정이 필요 없는 변수들을 넘겨줄 것 없이 손쉽게 개발 할 수 있도록 Default Argument를 제공하고 있다. 1. Default Argument - 정의한 Function 혹은 class의 매개변수를 아래와 같이 설정한다. // 아이스크림을 만드는 function이 있다면? // amount는 만드는 갯수, option은 맛이라고 할 때. fun makeIcecream(amount: Int = 1, option : String = "바닐라"): IceCream { return IceCream(amount, option) } //..
[안드로이드/MpAndroidChart] MpAndroidChart에서 Marker 커스텀하기 그래프의 바를 터치할 때 해당 데이터를 보여주는 Marker를 구현중에 있었는데, 공식 문서에 안내되어 있는 getOffset()을 Override하는 방식으로는 위치조정을 하는 것이 어려웠다. 구글링을 더 해보니 getXOffset, getYOffset을 override해 사용하는 경우가 많았으나, Kotlin 환경때문인지 몰라도 override 메소드가 보이지 않았다. 최종적으로 MarkerView의 draw 메소드를 override하여 보여주고자 하는 위치를 조정해 보여주는 걸로 구현을 마칠 수 있었다. * MPAndroidChart 3.1.0 버전에서 진행 * BarChart 사용 * Kotlin 베이스 1. BarChart 구성 완료 BarEntry, BarDataSet, Ba..
[안드로이드 | 코틀린] 코틀린으로 Queue 사용해보기 프로젝트에서 요구사항 구현을 위해 코틀린의 Queue 클래스를 활용해보기로 했다. Queue는 기본 java.util 패키지 내에 포함되어 있으며, Queue를 사용하면 IDE가 java.util.* import를 새롭게 추가하는 것을 확인할 수 있을 것이다. 그럼 Queue를 쓸 때에 사용 가능한 function을 살펴보자. - add(element: E) Any type의 element를 Queue에 추가한다. Any는 코틀린의 모든 클래스의 최상단 super 클래스로, 결국 어떤 클래스든지 문제없이 사용이 가능하다는 것이다. Queue에 element를 더하는데 성공하면 true를 return하며, 실패시 IllegalStateException을 발생시킨다. - element() element()는..