Перейти к содержимому
Меню
  • Java SE
  • Android
  • Поиск
  • Java SE
  • Android

JAVA-HELP

Сайт для Java разработчиков

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

Категории
  • Инструменты разработчика
Предыдущая заметка

Группирующий плагин для Android Studio

Следующая заметка

Тестирование в Android с Mockito

Рубрики

  • Android
    • Android-библиотеки
    • Android-сниппеты
    • Material Design
    • Инструменты разработчика
    • Уроки Android
  • Java SE
    • Java-сниппеты
    • Изучение Java
    • Обзор Java-классов
    • Основы Java
  • Kotlin

Популярные записи

  • Загрузка изображений с помощью библиотеки Glide. Начало работы
  • Руководство по использованию ORM DBFlow в Android-приложении
  • Анимированный Toolbar: фичи Design Support Library
  • Я хочу программировать под Android. Вопрос #5
  • Используем ACRA в своем приложении

Copyright © 2020– JAVA-HELP. Все права защищены. Политика конфиденциальности