본문 바로가기
DEBUG/TDD

Robolectric Getting Started

by 에디83 2017. 1. 23.

build.gradle에 아래 내용을 추가한다.


testCompile "org.robolectric:robolectric:3.2.2"


Test Class에 Robolectric Annotation을 추가한다.

package org.robolectric.myreference;

import org.junit.Before;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class MainActivityTest {


}


Before Annotation을 이용하여 MainActivity를 생성한다.

package org.robolectric.myreference;

import org.junit.Before;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class MainActivityTest {

private MainActivity mainActivity;

@Before
public void setUp() throws Exception {
mainActivity = Robolectric.setupActivity(MainActivity.class);
}

}

MainActivity가 create 될 때 HelloWorld Text가 정상적으로 load가 되는지에 대해서 Test Case를 작성해본다.

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="org.robolectric.myreference.MainActivity">

<TextView
android:id="@+id/text_hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />

</RelativeLayout>



Android Test Code에서 assert 를 하기 위해 플러그인을 적용한다.

assertj-android를 사용할텐데 자세한 내용은 아래 홈페이지에서 확인한다.


https://github.com/square/assertj-android


가이드에 나와있는대로 아래만 적용을 하게 되면 아래와 같은 error를 만나게 된다.

testCompile 'com.squareup.assertj:assertj-android:1.1.1'


Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (25.0.1) and test app (22.2.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.


Error:Execution failed for task ':app:prepareDebugUnitTestDependencies'.

> Dependency Error. See console for details.


아래 처럼 특정패키지를 exclude 시켜주자

testCompile('com.squareup.assertj:assertj-android:1.1.1', {
exclude group: 'com.android.support', module: 'support-annotations'
})


그리고 Test Case를 만든다음 hello world text view를 찾은다음 예상되어지는 텍스트와 비교해서 assert를 하게 되면 성공여부를 확인할 수 있다.

package org.robolectric.myreference;

import android.widget.TextView;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class MainActivityTest {

private MainActivity mainActivity;

@Before
public void setUp() throws Exception {
mainActivity = Robolectric.setupActivity(MainActivity.class);
}

@Test
public void whenActivityOnCreated_thenShowHelloWorldText() throws Exception {
TextView helloWorldTextView = (TextView) mainActivity.findViewById(R.id.text_hello_world);
assertThat(helloWorldTextView.getText().toString()).isEqualTo("Hello World!");
}
}


댓글