2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Robolectric에서 Dagger Hilt와 함께 테스트하는 방법은 무엇인가요?

_____
Q1: Robolectric에서 Dagger Hilt를 사용하려면 어떤 설정이 필요한가요?
A1: Robolectric과 Dagger Hilt를 함께 사용하려면 기본적으로 다음 설정이 필요합니다.
- `androidx.test:core` 및 `org.robolectric:robolectric` 의존성 추가
- Hilt 테스트용 `hilt-android-testing` 및 관련 kapt 플러그인 적용
- `@HiltAndroidTest` 어노테이션을 테스트 클래스에 붙임
- 테스트에서 Hilt 컴포넌트 생성 및 주입을 위한 `HiltAndroidRule` 사용
- Robolectric 환경에 맞춰 `Application` 클래스를 Hilt를 지원하는 클래스로 지정 (예: `@HiltAndroidApp` 어노테이션 적용된 애플리케이션 클래스)

---

Q2: 테스트에서 Hilt 컴포넌트 초기화는 어떻게 하나요?
A2: 테스트 클래스에 다음과 같이 `HiltAndroidRule`을 선언하고, `@Before` 메서드에서 `hiltRule.inject()`를 호출합니다.
```kotlin
@HiltAndroidTest
@RunWith(RobolectricTestRunner::class)
class ExampleTest {

@get:Rule
val hiltRule = HiltAndroidRule(this)

@Before
fun init() {
hiltRule.inject()
}

@Test
fun testSomething() {
// 테스트 코드
}
}
```

---

Q3: Robolectric에서 Hilt를 적용한 Application 클래스를 사용하는 방법은?
A3: 테스트 시 `AndroidManifest.xml`을 수정하거나, `@Config(application = HiltTestApplication::class)` 어노테이션을 테스트 클래스에 추가해서 Hilt가 적용된 Application 클래스를 사용하도록 설정해야 합니다.
예:
```kotlin
@HiltAndroidTest
@Config(application = HiltTestApplication::class)
@RunWith(RobolectricTestRunner::class)
class ExampleTest { ... }
```
그리고 `build.gradle`에 다음을 추가해줍니다:
```gradle
android {
defaultConfig {
testInstrumentationRunner "com.example.CustomTestRunner"
testInstrumentationRunnerArgument "runnerBuilder", "hilt"
}
}
```
또는 Hilt에서 제공하는 `HiltTestApplication`을 사용하게 됩니다.
---

Q4: 커스텀 테스트 런너를 생성해야 하나요?
A4: Robolectric 환경에서 Dagger Hilt 테스트를 돌릴 때는 일반적으로 커스텀 테스트 런너를 만들어 `HiltTestApplication`을 사용하도록 설정할 수 있습니다. 하지만 Robolectric 4.x 이후부터는 다음과 같이 `@Config(application = HiltTestApplication::class)`를 붙이는 것으로 충분할 수 있습니다.
필요하다면:
```kotlin
class CustomTestRunner : RobolectricTestRunner(RobolectricTestRunner.Builder()) {
override fun getApplicationClass(): Class = HiltTestApplication::class.java
}
```
그러나 최신 의존성과 설정 환경에 따라 달라질 수 있습니다.

---

Q5: Hilt와 Robolectric을 함께 쓸 때 주의할 점이 있나요?
A5:
- `HiltAndroidRule`는 항상 테스트 클래스에서 선언하고 사용해야 합니다.
- `@HiltAndroidTest` 어노테이션을 붙여 Hilt 컴포넌트가 테스트 컨텍스트에 생성되도록 해야 합니다.
- `@BindValue` 어노테이션을 통해 테스트 내에서 의존성 주입된 객체를 대체할 수 있습니다.
- Robolectric 설정(`@Config`)에서 Application 클래스를 꼭 Hilt가 지원하는 클래스로 지정해야 합니다.
- AndroidJUnit4와 Robolectric을 혼용하지 않고 Robolectric 테스트에서는 RobolectricTestRunner를 사용하세요.
- Dagger Hilt의 테스트 의존성이 최신 버전인지 확인하세요.

---

Q6: 의존성 주입된 모듈을 테스트용으로 교체하려면 어떻게 하나요?
A6: 테스트 클래스 내에서 `@BindValue`와 `@UninstallModules`를 활용해 테스트용 모듈을 주입하거나 기존 모듈을 제거할 수 있습니다.
예:
```kotlin
@HiltAndroidTest
@UninstallModules(NetworkModule::class)
@Config(application = HiltTestApplication::class)
@RunWith(RobolectricTestRunner::class)
class ExampleTest {

@BindValue
@JvmField
val fakeRepository: FakeRepository = FakeRepositoryImpl()

@get:Rule
val hiltRule = HiltAndroidRule(this)

@Before
fun init() {
hiltRule.inject()
}

@Test
fun testWithFakeRepo() { ... }
}
```

---

요약 : Robolectric에서 Dagger Hilt와 함께 테스트하려면, `@HiltAndroidTest`와 `HiltAndroidRule`을 사용하고, `@Config`로 HiltTestApplication을 명시하며 필요시 커스텀 테스트 런너를 만들고, `@BindValue`를 이용해 테스트용 의존성을 교체하는 방식을 취합니다.
Robolectric 테스트 환경에서 Dagger Hilt를 함께 사용하는 것은 Android의 의존성 주입을 테스트에 통합할 때 매우 유용합니다.

하지만 Hilt는 기본적으로 Android Instrumented Test 환경을 대상으로 설계되어 있고, Robolectric은 JVM 환경에서 구동되기 때문에 몇 가지 설정과 준비 작업이 필요합니다.

아래는 Robolectric에서 Dagger Hilt를 함께 사용하는 방법을 단계별로 자세히 설명한 내용입니다.

1. 프로젝트 의존성 설정 먼저 Gradle에 필요한 의존성을 추가해야 합니다.

- Hilt 의존성 (컴파일 및 테스트용) - Robolectric 및 관련 테스팅 라이브러리 예시 (app/build.gradle): ```gradle plugins { id 'com.android.application' id 'kotlin-android' id 'dagger.hilt.android.plugin' // ... } android { // ... testOptions { unitTests.includeAndroidResources = true // Robolectric에서 Android 리소스 사용 시 필요 } } dependencies { implementation "com.google.dagger:hilt-android:" kapt "com.google.dagger:hilt-compiler:" testImplementation 'junit:junit:4.13.2' testImplementation "org.robolectric:robolectric:" testImplementation "com.google.dagger:hilt-android-testing:" kaptTest "com.google.dagger:hilt-compiler:" // Optional: androidx.test core (Robolectric와 함께 쓰기도 함) testImplementation "androidx.test:core:1.4.0" } ``` > 여기서 `` 과 `` 자리에는 최신 안정화 버전을 넣습니다.

그리고 Hilt Gradle 플러그인도 프로젝트의 최상단 `build.gradle`에 추가되어 있어야 합니다.

---

2. Hilt 테스트용 설정 및 애플리케이션 클래스로 지정 Hilt를 사용하는 앱에서는 보통 `@HiltAndroidApp`이 붙은 애플리케이션 클래스가 있습니다.

테스트 환경에서 Hilt가 작동하도록 하려면 테스팅용 애플리케이션 클래스를 만들고, Robolectric에 지정해줍니다.

```kotlin // Hilt용 애플리케이션 서브클래스 (테스트용) @HiltAndroidApp class HiltTestApplication : Application() ``` Robolectric 테스트 클래스에서 이 애플리케이션 클래스를 지정하기 위해, 테스트 클래스 위에 `@Config` 어노테이션으로 지정합니다.

```kotlin @HiltAndroidTest @RunWith(RobolectricTestRunner::class) @Config(application = HiltTestApplication::class) class MyTest { // ... } ``` ---

3. 테스트 클래스에 Hilt 초기화 및 룰 적용 Hilt의 테스트 룰(rule)을 적용하여 의존성 주입이 제대로 이루어지게 합니다.

```kotlin @HiltAndroidTest @RunWith(RobolectricTestRunner::class) @Config(application = HiltTestApplication::class) class MyTest { @get:Rule var hiltRule = HiltAndroidRule(this) @Before fun init() { hiltRule.inject() } @Test fun sampleTest() { // your test code } } ``` - `@HiltAndroidTest`: Hilt 테스트임을 명시 - `HiltAndroidRule`: 필드를 주입하거나 초기화 해주는 룰을 생성 - `hiltRule.inject()`: 테스트 전 의존성 주입 수행 ---

4. 필요한 Hilt 모듈 테스트용으로 대체하기 만약 테스트 중에 실제 모듈 대신 별도의 테스트용 모듈을 주입하고 싶다면, `@TestInstallIn`을 활용해 테스트 모듈을 정의해서 대체할 수 있습니다.

예: ```kotlin @Module @TestInstallIn( components = [SingletonComponent::class], replaces = [NetworkModule::class] ) object FakeNetworkModule { @Provides fun provideFakeService(): ApiService { return FakeApiService() } } ``` 이 모듈은 원래의 `NetworkModule` 대신 테스트 시 주입됩니다.

---

5. Robolectric 리소스 설정 Hilt는 Android 리소스를 참조할 때가 있는데, Robolectric에서 이를 활용하도록 위에서 보았듯 `testOptions { unitTests.includeAndroidResources = true }` 설정이 필요합니다.

또, Robolectric은 AndroidManifest.xml 및 res 폴더를 잘 인식하도록 프로젝트 구조가 표준이어야 하고, `@Config`에서 manifest와 res 경로를 명시해줄 수도 있습니다.

---

6. 주의사항 및 팁 - Hilt와 Robolectric은 JVM 테스트 환경에서 돌아가므로, 최신 버전의 두 라이브러리를 사용하는 것이 호환성에 도움이 됩니다.

- `@HiltAndroidTest`는 Hilt 컴포넌트를 생성해주기 때문에 반드시 붙여야 하며, 그렇지 않으면 주입이 작동하지 않습니다.

- Robolectric 테스트는 Android Instrumented 테스트보다 빠르지만, 완벽하게 동일한 환경은 아니므로 진짜 장치나 에뮬레이터에서 따로 Instrumented 테스트도 수행해야 합니다.

- 복잡한 의존성 주입 계층이나 Activity, Fragment 주입 등에서는 Hilt가 주입하는 컴포넌트가 잘 초기화되는지 `HiltAndroidRule`를 통한 초기화가 필수입니다.

- KSAnnotaionProcessor(kapt)가 제대로 작동해야 하므로 `kapt` 설정이 올바른지 확인합니다.

--- 종합 요약 1. Hilt와 Robolectric 관련 의존성 추가

2. 테스트용 `@HiltAndroidApp` 애플리케이션 클래스 생성

3. 테스트 클래스에 `@HiltAndroidTest`, `@RunWith(RobolectricTestRunner::class)`, `@Config(application = HiltTestApplication::class)` 어노테이션 추가

4. `HiltAndroidRule` 선언 및 `hiltRule.inject()` 호출

5. 필요시 테스트용 모듈을 `@TestInstallIn`으로 정의하여 실제 모듈 대체

6. `testOptions`에서 `includeAndroidResources = true` 설정

7. 최신 버전 라이브러리를 사용하고 빌드 환경 점검 이렇게 설정하면, Robolectric 환경에서 Hilt 의존성 주입이 정상 작동하는 테스트를 작성할 수 있습니다.

--- 추가로, Google 공식 문서(https://dagger.dev/hilt/testing.html)에서도 `@HiltAndroidTest`와 `HiltAndroidRule`을 함께 사용해 Instrumented 및 Robolectric 테스트에 Hilt를 적용하는 방법을 안내하고 있으니 참고하면 좋습니다.

작성자: 정은지 [비회원] | 작성일자: 1년 전 2025-05-26 03:52:00
조회수: 166 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.