В этом туториале я покажу, как написать модульный тест для 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
