Unit Test - Android

수호·2026년 1월 19일
post-thumbnail
  1. JUnit을 사용한 이유

    → 안드로이드 테스트의 기본 테스트 프레임 워크

  2. Android 테스트 방법

    • Local Unit Test (JVM Test) → 빠르고 가벼우며, 비즈니스 로직 / ViewModel / UseCase / Mapper 등의 순수 Kotlin 코드 테스트에 적합
    • Instrumentation Test (Android Test) → 실제 Android Framework 위에서 실행되는 테스트, UI / Lifecycle / Room DB / Navigation 등 Android API가 포함된 코드 테스트에 적합
  3. JUnit 구성 요소

    • @Test - 테스트 메서드 → JUnit의 가장 기본적인 구성 요소
      @Test
      fun test() {
      	val result = 2+3
      	assertEquals(5, result)
      }
    • @Before / @BeforeEach - 테스트 전 초기화 → 테스트 실행 전에 공통으로 필요한 세팅을 해줄 때 사용
      @Before
      fun setup(){
      	test = Test()
      }
    • @After / @AfterEach - 테스트 후 정리 → 테스트 수행 후 자원(Resource)을 정리할 때 사용
      @After
      fun tearDown(){
      	// DB 닫기, MockServer 종료 등
      }
    • Assert 계열 메서드 - 검증 → 예상 값과 실제 결과를 비교해 테스트의 성공/실패를 판단
      assertEquals(expected, actual)두 값이 동일한지 확인
      assertNotEqualse(expected, actual)두 값이 다른지 확인
      assertTrue(condition)조건이 true인지 확인
      assertFalse(condition)조건이 false인지 확인
      assertNull(value)값이 null인지 확인
      assertNotNull(value)값이 null이 아닌지 확인
      assertThrows(Exception::class.java) {…}특정 예외가 발생하는지 확인
    • @Ignore - 테스트 제외 → 일시적으로 테스트를 실행하지 않도록 설정
      @Ignore("API 수정 중으로 테스트 제외")
      @Test
      fun apiTest() {...}
    • @Rule - 테스트 규칙 정의 → 특정 테스트 환경이나 설정을 적용할 때 사용 → Android에서는 특히 LiveData 테스트, Hilt 테스트, Compose 테스트 등에서 자주 사용
      @get:Rule
      val testRule = TestRule()
  1. Mock
    • 왜 Mock이 필요한가? → JUnit은 “테스트 실행”과 “결과 검증”을 담당하지만, 의존성(Dependencies)이 있는 코드를 직접 제어 못함
      class UserService(private val userRepository: UserRepository) {
      	fun getUserName(id: String) : String {
      		return userRepository.findById(id).name
      	}
      }
      → 이 경우 UserRepository는 DB와 통신할 수 있고, 네트워크를 호출할 수 있다. 그럼 테스트 시 실제 DB연결이나 서버 호출이 일어날 수 있으므로 단위 테스트(Unit Test)의 목적(”하나의 로직만 검증”)에 어긋난다. → 그래서 “진짜 객체” 대신 “가짜(Mock) 객체”를 만들어서 외부 의존성을 대채한다.
    • Mockito / MockK
      MockitoMockK
      주요 언어Java 기반Kotlin 전용
      Mock 생성Mockito.mock()mockk()
      동작 설정when(…).thenReturn(…)every {…} returns …
      호출 검증verify(…)verify {…}
      특징전통적인 Mocking 라이브러리코루틴, suspend 함수, DSL 친화적
    1. 그래서 우리팀은?
      • JUnit4 vs JUnit5 : JUnit5를 사용할 예정입니다. → 우리팀의 Unit Test 목적 순수 비즈니스 로직만 테스트 하기 위함 → 대부분 Kotlin 기반으로 MockK / 코루틴 테스트와 호환 목적 → UI/Andorid 테스트 코드 작성 시 JUnit4를 사용해도 됩니다. (강제성 x)
      • Mockito vs MockK : MockK를 사용 할 예정입니다. → 우리 프로젝트는 Kotlin 기반 / Java 테스트가 필요할 경우 Mockito 사용 가능
profile
처음부터 다시 시작!!

0개의 댓글