Unit-тесты в Android с Robolectric

В этом туториале я покажу, как написать модульный тест для Android-приложения с помощью фреймворка Robolectric.

Что такое Robolectric?

Robolectric разработан для того, чтобы позволить вам тестировать Android-приложения на виртуальной машине Java на основе фреймворка JUnit 4. Robolectric представляет собой фреймворк, который позволяет писать тесты и запускать их на компьютерной JVM, при этом используя Android API. Robolectric mock’ирует часть Android API, содержащегося в файле android.jar. Также Robolectric обеспечивает реализацию некоторых методов, в то время как стандартная поддержка модульного тестирования Android выдает исключения для всех Android-методов.

Использование Robolectric в тестах с Gradle

Чтобы использовать Robolectric для unit-тестов, просто добавьте следующую зависимость в ваш build.gradle файл.

dependencies {
    ...
    // Robolectric
    testCompile "org.robolectric:robolectric:3.0"
}

Ваши тесты должны располагаться в папке src/test. Классы, содержащие Robolectric-тесты должны быть аннотированы @RunWith(RobolectricGradleTestRunner.class). Также вы должны использовать @Config() для указания вашего класса BuildConfig.class. Следующий код показывает пример настройки теста для запуска с помощью Robolectric на JVM.

package com.vogella.android.test.robolectric;
import com.vogella.android.test.robolectric.BuildConfig;
import com.vogella.android.test.robolectric.R;
import com.vogella.android.test.robolectric.WelcomeActivity;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import static org.junit.Assert.assertNotNull;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class WelcomeActivityTest
{
    private WelcomeActivity activity;
    @Before
    public void setUp() throws Exception
    {
        activity = Robolectric.buildActivity( WelcomeActivity.class )
                              .create()
                              .resume()
                              .get();
    }
    @Test
    public void shouldNotBeNull() throws Exception
    {
        assertNotNull( activity );
    }
    @Test
    public void shouldHaveWelcomeFragment() throws Exception
    {
        assertNotNull( activity.getFragmentManager().findFragmentById( R.id.welcome_fragment ) );
    }
}

Вместо использования настроечной аннотации @Config, вы можете использовать файл resources/robolectric.properties. Перейдите сюда http://robolectric.org/configuring для получения большей информации.

Тестирование Robolectric

Следующий код является примером нескольких Robolectric-тестов.

package com.vogella.android.test.robolectric;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import com.example.BuildConfig;
import com.example.R;
import com.example.SecondActivity;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.shadows.ShadowToast;
import android.content.Intent;
import android.widget.Button;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class MyActivityTest {
        private MainActivity activity;
        @Test
        public void shouldHaveHappySmiles() throws Exception {
                String hello = new MainActivity().getResources().getString(
                                R.string.hello_world);
                assertThat(hello, equalTo("Hello world!"));
        }
        @Before
        public void setup()  {
                activity = Robolectric.buildActivity(MainActivity.class)
                                .create().get();
        }
        @Test
        public void checkActivityNotNull() throws Exception {
                assertNotNull(activity);
        }
        @Test
        public void buttonClickShouldStartNewActivity() throws Exception
        {
            Button button = (Button) activity.findViewById( R.id.button2 );
            button.performClick();
            Intent intent = Shadows.shadowOf(activity).peekNextStartedActivity();
            assertEquals(SecondActivity.class.getCanonicalName(), intent.getComponent().getClassName());
        }
        @Test
        public void testButtonClick() throws Exception {
                MainActivity activity = Robolectric.buildActivity(MainActivity.class)
                                .create().get();
                Button view = (Button) activity.findViewById(R.id.button1);
                assertNotNull(view);
                view.performClick();
                assertThat(ShadowToast.getTextOfLatestToast(), equalTo("Lala") );
        }
}

Полезные ссылки по теме

http://robolectric.org — сайт Robolectric
https://github.com/robolectric/robolectric/wiki/2.4-to-3.0-Upgrade-Guide — инструкция по переходу на Robelectric 3.0
https://github.com/robolectric/robolectric — страница Robolectric на Github
https://github.com/robolectric/robolectric-samples — примеры Robolectric
https://github.com/robolectric/deckard-gradle — демонстрационный проект Robolectric и Espresso

Источник: Using Robolectric for Android unit testing on the JVM — Tutorial

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Ваш комментарий будет опубликован после модерации