일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 안드로이드 유닛 테스트 예시
- rxjava cold observable
- 클래스
- 스택 큐 차이
- 안드로이드 레트로핏 crud
- ar vr 차이
- 서비스 vs 쓰레드
- 안드로이드 유닛테스트란
- ANR이란
- 큐 자바 코드
- 자바 다형성
- 2022 플러터 안드로이드 스튜디오
- 객체
- 서비스 쓰레드 차이
- 플러터 설치 2022
- android retrofit login
- 안드로이드 os 구조
- 안드로이드 라이선스
- rxjava disposable
- android ar 개발
- 안드로이드 레트로핏 사용법
- Rxjava Observable
- 안드로이드 라이선스 종류
- 스택 자바 코드
- 멤버변수
- rxjava hot observable
- jvm이란
- 2022 플러터 설치
- jvm 작동 원리
- 안드로이드 유닛 테스트
- Today
- Total
나만을 위한 블로그
[Android] 레트로핏 함수를 단위 테스트하는 법 (Kotlin) 본문
API 문서를 보고 만든 API의 작동 상태를 확인하기 위해 구글에서 확인한 코드들로 레트로핏 함수를 단위 테스트했는데 한글 자료가 얼마 없어서 포스팅한다. 아래 방법이 정답은 아니니 주의하자.
private lateinit var retrofit: Retrofit
private lateinit var service: ApiInterface
@Before
fun setUp() {
retrofit = Retrofit.Builder()
.baseUrl(BuildConfig.REST_BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(ApiModule.provideGson()))
.build()
service = retrofit.create(ApiInterface::class.java)
}
옆에 test라고 써진 패키지에 적당히 파일 하나 만들고 전역 lateinit var 프로퍼티 2개를 만든다.
그리고 @Before에서 해당 프로퍼티들을 각각 초기화한다. 그래야 @Test 어노테이션이 붙은 테스트 함수에서 사용할 수 있다.
GsonConverterFactory.create() 안의 코드는 Hilt를 사용하기 위해 만든 모듈 클래스에 있는 Gson 프로퍼티 생성 함수다. Hilt를 적용하지 않았다면 그냥 레트로핏 사용법 검색하면 나오는 Gson 프로퍼티 초기화 코드를 함수로 만든 뒤 저 안에서 호출하면 된다.
본격적인 테스트 함수는 아래와 같이 짤 수 있다. 함수명에 한글을 넣을 수 있으니 테스트 함수의 이름 정도는 한글로 쓰면 테스트 함수들이 많아져도 각각이 무엇인지 좀 더 빨리 알아볼 수 있어서 좋았다.
원래 사용하던 함수명, 매개변수명을 바꿔서 좀 이상하게 보일 수 있다. 실제로 작성할 때는 본인이 알아볼 수 있는 간단한 이름으로 함수명을 만들자.
@Test
fun `매개변수와 헤더를 넣어서 호출하면 2xx에서 3xx의 상태코드를 받는다`() {
val response: Response<String> = service.testGetRoomInformation(
"Bearer 대충 토큰 형태의 문자열",
111,
1,
10,
"테스트 문자열"
).execute()
assertTrue(response.isSuccessful)
assertTrue(response.body() != null)
println("response.message() : ${response.message()}")
println("response.body() : ${response.body()}")
}
특이한 거라면 인터페이스에 리턴형이 Call<String>인 추상 함수를 여기서 호출할 땐 리턴형이 Response<String>인 프로퍼티에 담는다는 것이다. 이 처리를 하려면 execute()를 꼭 선언해야 한다. 그렇지 않으면 컴파일 에러가 발생한다.
마지막 2줄의 println()은 실제로 서버에서 값을 어떻게 받아오는지 궁금해서 확인하려고 넣은 것이다. 저 2줄을 없애도 테스트 함수는 정상 작동한다.
매개변수가 없다면 생략하고, 있다면 적당한 값을 넣어준다. 그리고 assertTrue()를 사용하는데 이것의 임포트 문구는 아래와 같다. 만약 이것 말고 다른 의존성을 임포트했다면 이걸로 바꾸자.
import org.junit.Assert.assertTrue
해시맵 등을 사용해서 @Body로 넘겨야 하는 경우에는 해시맵에 적당한 값을 넣어서 초기화하는 로직이 붙을 뿐 크게 다르지 않다.
@Test
fun `idx와 문자열을 해시맵에 담아 보내면 상태코드 200을 받는다`() {
val hashMap = hashMapOf<String, Any>(
CD_IDX to 1,
CONTENT to "테스트 문자열22"
)
val call: Response<String> = service.createUserPost(
"Bearer 대충 토큰 형태의 문자열",
hashMap
).execute()
println("call.code() : ${call.code()}")
}
이런 형태로 내가 만든 레트로핏 함수가 잘 작동하는지, 서버에서 내가 원하는 응답을 받아오는지 확인할 수 있으니 만들어서 확인해보면 좋을 듯 하다.
Hilt, Flow를 적용했지만 둘을 같이 사용하면서 단위 테스트를 진행하는 방법은 아직 찾아보는 중이다. 그 전까진 번거롭지만 엔드포인트 별로 Flow용 함수, 일반 레트로핏 함수를 2개 만들어서 테스트를 진행할 예정이다.
이렇게라도 테스트 코드를 짜니 자신감이 생기는 걸 느꼈다. 번거롭긴 하지만 틈틈이 작성하는 습관을 들이려고 한다.
'Android' 카테고리의 다른 글
[Android] 데이터바인딩, 리사이클러뷰, 콜백을 사용해 클릭 이벤트 구현하기 (0) | 2022.07.18 |
---|---|
[Android] Room 사용 시 To use Coroutine features, you must add `ktx` artifact from Room as a dependency 에러 해결 (0) | 2022.06.29 |
[Android] Coroutine Best Practices - 1 - (0) | 2022.06.26 |
[Android] 탭 레이아웃 + 뷰페이저2 UI 테스트하는 법 (0) | 2022.06.22 |
[Android] AvatarView란? (0) | 2022.06.20 |