상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - Robolectric에서 의존성 주입을 어떻게 처리하나요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Robolectric은 안드로이드 유닛 테스트 프레임워크 중 하나로, 안드로이드 에뮬레이터 없이 JVM 상에서 안드로이드 코드를 실행하게 해줍니다. 이 환경에서 의존성 주입(<a href='https://sangseek.com/sangseeks/Dependency/ko'>Dependency</a> 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를 기본적으로 지<a href='https://sangseek.com/sangseeks/원하/ko'>원하</a>는 것은 아니지만, 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순위입니다.
수정하기
취소하기