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