반응형

Robolectric 은 Gradle 이나 Bazel 프로젝트에 적용하기 가장 좋습니다.
안드로이드 스튜디오는 기본적으로 Gradle 빌드 시스템을 지원하기 때문에 Gradle 을 기준으로 설명하겠습니다.

 

Android Studio 에서 빌드하기(Gradle)

Robolectric 은 Android Gradle Plugin 3.2.1 버전 이상에서 잘 동작합니다.

 

먼저 앱 수준의 build.gradle 에 다음과 같이 추가해줍니다.

android {
    // ...
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

dependencies {
    // ...
  testImplementation 'org.robolectric:robolectric:4.3'
}

 

만약 안드로이드 스튜디오 버전이 3.3 이하라면 gradle.properties 파일에 아래 한 줄도 추가해줍니다.

android.enableUnitTestBinaryResources=true

이제 준비는 끝났습니다.

 

테스트 코드로 가셔서 클래스 수준에 @RunWith 과 함께 RobolectricTestRunner 을 적용해주면 됩니다.

@RunWith(RobolectricTestRunner.class)
public class SimpleTest {
}

 

테스트 작성해보기

예를 들어 WelcomActivity 에서 Login Button 을 누르면 LoginActivity 로 전환하는 어플리케이션이 있다고 가정하고, 이를 테스트 해보겠습니다.

 

이때 우리가 체크할 수 있는 것은 로그인 버튼을 눌렀을 때 올바른 인텐트로 전환이 이루어지는가 입니다.

 

Robolectric 은 어디까지나 Unit test framework 이기 때문에, LoginActivity 를 실제로 실행할 수는 없습니다. 그렇기 때문에 WelcomActivity 에서 올바른 인텐트로 전환을 시도하는 지만 확인하는 테스트를 작성해보겠습니다.

@RunWith(RobolectricTestRunner.class)
public class WelcomeActivityTest {

    @Test
    public void clickingLogin_shouldStartLoginActivity() {
        WelcomeActivity activity = Robolectric.setupActivity(WelcomeActivity.class);
        activity.findViewById(R.id.login).performClick();

        Intent expectedIntent = new Intent(activity, LoginActivity.class);
        Intent actual = shadowOf(RuntimeEnvironment.application)
                                                        .getNextStartedActivity();
        assertEquals(expectedIntent.getComponent(), actual.getComponent());
    }
}

Robolectric 은 안드로이드 프레임워크를 많은 Test API 와 함께 확장하였습니다.

Robolectric 은 추가적인 환경설정과 안드로이드 컴포넌트들의 내부적인 상태나 히스토리 등에 접근할 수 있게 해주는데, 이는 테스트에 몹시 유용합니다.

 

많은 Test API 는 각각의 안드로이드 클래스들을 확장하는데, 이는 shadowOf() 메소드를 통해 접근할 수 있습니다.

// retrieves all the toasts that have been displayed...
List<Toast> toasts = shadowOf(application).getShownToasts();

 

또한 Test API 는 shadow 된 특정 안드로이드 프레임워크 클래스에 한해서 static method 도 접근 가능합니다.

// simulates a new display being plugged into the device...
ShadowDisplay.addDisplay("xlarge-port");

 

Robolectric 의 Test API 에 대한 문서는 Robolectric plugin for Chrome 을 설치하거나 Android API Reference 를 방문하시면 되겠습니다.

 

 

반응형
반응형