Robolectric에서 Mock 객체를 생성하는 방법은 무엇인가요?
_____A1: Robolectric 자체는 Mockito와 같은 Mocking 프레임워크를 직접 제공하지 않습니다. 따라서 일반적으로 Robolectric 테스트에서 Mockito를 함께 사용하여 Mock 객체를 생성합니다. 즉, Mockito의 `@Mock` 어노테이션이나 `Mockito.mock()` 메서드를 사용해 Mock 객체를 생성하고, Robolectric 테스트 내에서 이를 활용할 수 있습니다.
---
Q2: Robolectric 테스트에서 Mockito를 연동하려면 어떻게 설정해야 하나요?
A2:
1. `build.gradle` 파일에 다음과 같이 의존성을 추가합니다:
```gradle
testImplementation 'org.robolectric:robolectric:
testImplementation 'org.mockito:mockito-core:
testImplementation 'org.mockito:mockito-inline:
testImplementation 'org.mockito:mockito-android:
```
2. 테스트 클래스에 `@RunWith(RobolectricTestRunner.class)`를 붙입니다.
3. Mock 객체를 선언할 때 `@Mock` 어노테이션을 쓰고, `MockitoAnnotations.initMocks(this);` 또는 JUnit4 기준 `@Before` 메서드 내에서 초기화합니다. JUnit5 사용 시에는 `@ExtendWith(MockitoExtension.class)` 등을 활용합니다.
---
Q3: 예시 코드로 Robolectric에서 Mock 객체를 생성하는 방법은?
A3:
```java
@RunWith(RobolectricTestRunner.class)
public class ExampleRobolectricTest {
@Mock
MyDependency myDependency;
@Before
public void setUp() {
MockitoAnnotations.openMocks(this);
@Test
public void testWithMock() {
when(myDependency.someMethod()).thenReturn("mocked result");
MyClass myClass = new MyClass(myDependency);
String result = myClass.callDependency();
assertEquals("mocked result", result);
}
}
```
---
Q4: Robolectric 외에 사용하는 Mock 프레임워크가 있나요?
A4: 가장 많이 사용하는 것은 Mockito이며, 그 외에도 MockK (Kotlin용), EasyMock 등이 있으나 Robolectric과는 별개로 활용합니다. Robolectric 테스트에서는 기본적으로 Mockito가 가장 호환성이 좋고 널리 쓰입니다.
---
Q5: Robolectric 안에서 Android SDK 클래스도 Mocking 가능한가요?
A5: Robolectric 자체가 Android SDK 클래스를 JVM 환경에서 흉내 내어 동작하게 해주므로, 대부분의 Android 클래스는 실제 구현체가 Robolectric에 의해 대체됩니다. 그 외에 자신이 만든 의존성이나 인터페이스를 Mockito로 Mocking하는 식으로 사용하는 것이 일반적입니다.
---
요약:
- Robolectric은 Mock 객체 생성 기능을 제공하지 않음
- Mockito를 함께 사용해 Mock 객체 생성
- `@Mock`, `MockitoAnnotations.openMocks(this)` 와 같은 일반 Mockito 패턴 적용 가능
- Robolectric 테스트 클래스에 `@RunWith(RobolectricTestRunner.class)` 적용
- build.gradle에 Robolectric과 Mockito 의존성 추가 필요
하지만 Robolectric 자체는 Mock 객체를 생성하는 기능을 제공하지 않습니다.
대신, Mockito, MockK 같은 목 라이브러리와 함께 사용하여 Mock 객체를 만듭니다.
Robolectric 테스트에서 Mock 객체를 생성하는 기본적인 방법은 다음과 같습니다.
1. Mockito 의존성 추가 먼저 build.gradle에 Mockito 의존성을 추가해야 합니다.
예를 들어: ```gradle testImplementation 'org.mockito:mockito-core:4.+' testImplementation "org.robolectric:robolectric:4.+" ``` Mockito Android용인 mockito-android 대신 mockito-core를 사용하세요.
Robolectric 테스트는 JVM 환경에서 수행되므로 mockito-core가 적합합니다.
2. 테스트 클래스에서 Mock 객체 생성 Mock 생성은 Mockito.mock()이나 @Mock 애노테이션을 사용할 수 있습니다.
- Mockito.mock() 사용: ```java import static org.mockito.Mockito.mock; public class ExampleTest { @Test public void testSomething() { MyClass myMock = mock(MyClass.class); // myMock 메서드 동작 설정 및 검증 수행 } } ``` - @Mock 및 MockitoAnnotations.initMocks() 또는 MockitoAnnotations.openMocks() 사용: ```java import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.junit.Before; public class ExampleTest { @Mock MyClass myMock; @Before public void setup() { MockitoAnnotations.openMocks(this); } @Test public void testSomething() { // myMock 사용 } } ```
3. Robolectric 환경에서의 주의사항 - Robolectric 테스트에서는 안드로이드 컴포넌트를 직접 생성하여 활용할 수 있지만, 내부 의존성이 복잡한 경우 Mock 객체로 대체하면 테스트가 더 단순해집니다.
- Mockito를 사용할 때, final 클래스나 final 메서드는 모킹이 안 될 수 있으므로 mockito-inline 을 추가로 설정할 수 있습니다.
- Kotlin 사용 시에는 MockK를 대신 사용할 수 있고, Robolectric 테스트 내에서도 MockK가 잘 동작합니다.
4. 예시: Activity 내 의존성 Mock하기 ```java @RunWith(RobolectricTestRunner.class) public class MainActivityTest { @Mock SomeDependency mockDependency; @Before public void setUp() { MockitoAnnotations.openMocks(this); } @Test public void testActivityBehavior() { MainActivity activity = Robolectric.buildActivity(MainActivity.class).create().get(); activity.setDependency(mockDependency); when(mockDependency.doSomething()).thenReturn("Mocked Result"); String result = activity.callDependency(); assertEquals("Mocked Result", result); } } ``` 위 예제처럼 Robolectric으로 Activity를 생성하고, 내부 의존성을 Mockito Mock 객체로 주입하여 테스트할 수 있습니다.
Robolectric은 안드로이드 컴포넌트의 동작을 JVM 환경에서 흉내 내는 역할을 하며 Mock 객체 생성은 Mockito(혹은 MockK) 같은 별도 Mock 라이브러리를 활용하여 만듭니다.
따라서 Robolectric 테스트에서 Mock 객체를 만들고 싶다면 Mockito.mock() 또는 @Mock 애노테이션 같이 Mockito의 표준 방식을 그대로 사용하면 됩니다.
작성자:
박주희 [비회원]
| 작성일자: 1년 전
2025-05-26 03:51:08
조회수: 176 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 176 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.