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

Robolectric에서 의존성 주입을 어떻게 처리하나요?

_____
Q1: Robolectric 테스트에서 의존성 주입(Dependency Injection, DI)을 어떻게 적용하나요?
A1: Robolectric은 실제 안드로이드 프레임워크 코드를 JVM에서 실행할 수 있게 해주지만, 의존성 주입 자체 기능은 제공하지 않습니다. 따라서 주로 Dagger, Hilt, Koin 같은 DI 프레임워크를 그대로 사용하거나, 테스트용 모듈을 별도로 정의해 테스트 상황에 맞는 의존성을 주입하는 방식을 사용합니다.

---

Q2: Hilt를 사용하는 프로젝트에서 Robolectric 테스트 시 의존성 주입은 어떻게 구성하나요?
A2: Hilt는 Robolectric과 공식적으로 통합되어 있어, `@HiltAndroidTest` 어노테이션을 테스트 클래스에 붙이고, `HiltAndroidRule`을 사용해 초기화합니다. 이때 테스트용 모듈을 통해 실제 의존성을 가짜(Mock) 혹은 테스트 구현체로 교체할 수 있습니다.

예시:
```java
@HiltAndroidTest
@RunWith(RobolectricTestRunner.class)
public class MyFragmentTest {
@Rule
public HiltAndroidRule hiltRule = new HiltAndroidRule(this);

@Before
public void init() {
hiltRule.inject();
}

@Test
public void testFragment() {
// 테스트 코드
}
}
```

또한 `TestInstallIn` 어노테이션을 써서 테스트용 DI 모듈을 지정할 수 있습니다.

---

Q3: Dagger/Hilt 없이 순수 Robolectric + DI가 필요한 경우 어떻게 하나요?
A3: 이 경우 테스트용 Application 클래스를 만들어 의존성 주입 구성을 직접 설정합니다. Robolectric 테스트 시 `@Config(application = TestApp.class)` 를 지정해 교체한 Application을 사용하게 하고, `TestApp`에서 원하는 Mock 또는 Fake 의존성을 수동으로 초기화합니다.

---

Q4: ViewModel 등 AndroidX 컴포넌트와 DI는 Robolectric에서 문제 없나요?
A4: 네, Robolectric이 컴포넌트 라이프사이클을 지원하므로, ViewModel과 함께 DI 프레임워크를 사용하는 테스트 작성이 가능합니다. 단, ViewModelProvider.Factory 등을 적절히 Mock하거나 DI 모듈에서 교체해 주입해야 합니다.

---

Q5: Robolectric 테스트 시 의존성 주입 관련 일반적인 팁이 있나요?
A5:
- 테스트마다 DI 구성을 초기화해 독립적인 환경을 만든다.
- 실제 네트워크 호출, DB 액세스 등을 포함하는 의존성은 가짜(Mock) 객체로 교체한다.
- 테스트용 Application 클래스를 만들어 전역 의존성 관리 및 주입을 담당하게 하자.
- Hilt를 쓴다면 공식 Robolectric 통합 문서와 JUnit Rule을 활용한다.

---

요약:
Robolectric 자체는 DI 기능을 제공하지 않고, 기존 DI 프레임워크(Dagger, Hilt 등)를 그대로 활용합니다. 테스트용 모듈 설정, Application 교체, Hilt Rule 등으로 의존성 주입 환경을 구성하면, JVM 환경에서 안드로이드 컴포넌트와 함께 DI 기반 테스트를 원활하게 수행할 수 있습니다.
Robolectric은 안드로이드 유닛 테스트 프레임워크 중 하나로, 안드로이드 에뮬레이터 없이 JVM 상에서 안드로이드 코드를 실행하게 해줍니다.

이 환경에서 의존성 주입(Dependency Injection)을 사용하는 경우, 실제 앱에서 사용하는 DI 프레임워크와 테스트 환경을 어떻게 맞출지에 대한 고민이 필요합니다.

Robolectric에서 의존성 주입을 처리하는 방법을 자세히 설명해 드리겠습니다.

1. 기본 원칙 Robolectric은 안드로이드 컴포넌트(예: Activity, Service 등)를 실제 안드로이드 기기 없이 JVM 상에서 실행할 수 있도록 함으로써 테스트를 빠르게 수행하게 해줍니다.

그러나 이 과정에서 DI를 구현하는 코드를 어떻게 대체하거나 초기화할지가 중요합니다.

대부분의 의존성 주입 솔루션(예: Dagger, Hilt, Koin 등)은 런타임 시점에 컴포넌트에 의존성을 주입하거나, 애플리케이션 클래스에서 DI 컨테이너를 초기화합니다.

Robolectric에서 이를 잘 작동시키려면 테스트 환경에서 DI 컨테이너의 초기화나 의존성의 주입 과정을 올바르게 세팅해야 합니다.

---

2. Robolectric과 DI 통합 공통 패턴 (1) Application 클래스 활용 애플리케이션에서는 일반적으로 DI 컨테이너(예: Dagger 컴포넌트)를 초기화합니다.

Robolectric 테스트를 할 때 기본적으로 Application 클래스가 사용되는데, 테스트 환경에서는 이 Application을 커스텀해 DI 컨테이너를 테스트용으로 세팅하는 것이 일반적입니다.

- 테스트용 Application을 상속받거나 별도의 TestApplication 클래스를 만들어서 DI 컴포넌트를 테스트용 모듈이나 Mock 객체로 바꿔 주입합니다.

- Robolectric 테스트에서 `@Config(application = TestApplication.class)`처럼 테스트에 맞는 Application 클래스를 지정합니다.

(

2) 의존성 주입 시점 조절 의존성 주입이 Android 컴포넌트 생성자(예: Activity 생성자)에서 이루어질 수 없으므로, 주입 시점은 보통 `onCreate()` 또는 필드에 `@Inject` 등이 붙어 있으면 DI 프레임워크가 런타임에 주입하게 됩니다.

테스트 중에 해당 시점에서 DI 컨테이너가 이미 초기화되어 있어야 합니다.

---

3. Dagger 또는 Hilt 적용 시 Robolectric과 의존성 주입 처리법 - Dagger - 실제 앱에서는 Application 클래스에서 컴포넌트를 초기화합니다.

- 테스트에서는 Application을 상속해 테스트용 컴포넌트를 만들고, Mock 또는 Fake 의존성을 바인딩합니다.

- Activity를 테스트할 때는 `@Config(application = TestApplication.class)`를 써서 테스트 Application을 씁니다.

- 필요한 의존성들은 테스트용 모듈(TestModule)에서 정의해 Dagger 컴포넌트에 포함시켜 줍니다.

- Hilt - Hilt는 Dagger 기반이고, Application, Activity에 자동으로 DI를 해주고, `@HiltAndroidTest` 어노테이션을 제공합니다.

- 하지만 Robolectric 사용 시 Hilt를 함께 쓰려면 2가지 설정이 필요합니다.

- `@HiltAndroidTest` 어노테이션을 붙이고, `HiltTestApplication`을 사용하도록 `@Config(application = HiltTestApplication.class)` 지정합니다.

- Gradle 설정에서 `enableAggregatingTask = true` 같은 Hilt 관련 플러그인 옵션이 추가되어 있어야 합니다.

- 테스트용 모듈에서 `@BindValue` 어노테이션으로 Mock 객체를 바인딩합니다.

- Robolectric과 Hilt는 공식적으론 통합 지원되지만, 때때로 초기화 문제나 AndroidManifest 문제로 설정을 꼼꼼히 해야 합니다.

---

4. Koin 등 코틀린 기반 DI 프레임워크 사용 시 - 테스트에서 Koin startKoin() 함수를 호출해 테스트용 모듈을 초기화합니다.

- Robolectric이 Application을 띄우기 전에 startKoin()을 호출해야 하므로, 테스트 클래스의 `@Before` 혹은 `@BeforeClass`에서 초기화합니다.

- 테스트 종료 후에는 stopKoin()으로 중지합니다.

- Application 클래스를 커스텀해서 테스트 시점에 맞게 Koin 컨테이너를 교체하는 것도 가능합니다.

---

5. 수동 주입 또는 커스텀 Injector 활용 경우에 따라 DI 프레임워크를 직접 쓰지 않고, Robolectric에서만 수동으로 의존성을 주입하는 경우도 있습니다.

- 예: `new MyActivity()` 대신에 Robolectric으로 Activity를 생성한 후 테스트용 DI 컨테이너에서 직접 의존성을 가져와 필드에 할당 - 혹은 Injector 인터페이스를 만들고, 테스트 시에는 MockInjector를 사용해 별도 객체를 주입 이 방법은 복잡하지 않은 프로젝트나 DI 프레임워크 없이 의존성 관리만 테스트할 때 적합합니다.

---

6. 핵심 정리 - Robolectric에서 DI를 기본적으로 지원하는 것은 아니지만, Application 클래스 커스텀, DI 컨테이너 초기화, 테스트용 모듈 교체 등의 방식을 통해 충분히 의존성 주입을 테스트 환경에 맞게 조율 가능 - Dagger/Hilt의 경우 테스트 Application을 분리하거나, HiltTestApplication을 쓰고 애노테이션으로 테스트 모듈을 바인딩 - Koin은 테스트 시작 전에 startKoin()을 호출해 테스트용 모듈을 로드 - Mock이나 Fake 객체를 테스트용 모듈에서 바인딩해 생산 코드와 다른 객체를 사용할 수 있음 - 테스트 시점에 Application 및 액티비티 생성 후 DI가 자동 또는 명시적으로 진행되는지 항상 확인 --- 참고 예제 (Dagger + Robolectric) ```java @RunWith(RobolectricTestRunner.class) @Config(application = MyTestApplication.class) public class MyActivityTest { @Before public void setup() { // 테스트용 DI 컴포넌트 초기화 ((MyTestApplication) ApplicationProvider.getApplicationContext()).injectTestDependencies(); } @Test public void testSomething() { MyActivity activity = Robolectric.buildActivity(MyActivity.class).create().get(); // activity 내 의존성은 테스트용으로 주입되어 있음 ... } } ``` `MyTestApplication` 은 실제 앱의 Application을 상속하며, 테스트용 모듈을 바인딩하고 테스트용 DI 컴포넌트를 초기화하는 역할 한다.

--- 요약 Robolectric에서 의존성 주입은 애플리케이션 클래스 커스텀, 테스트용 DI 컨테이너 초기화, DI 프레임워크에 맞춘 테스트 Application 지정, 테스트 모듈이나 Mock 객체 바인딩으로 처리함. Dagger/Hilt/Koin 등 각종 DI 프레임워크마다 초기화 방식 및 테스트 대상 모듈 교체 방식이 다르니, 테스트에서 올바른 Application 클래스와 DI 컨테이너를 설정하는 것이 핵심이다.

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