Intereting Posts
Используйте glide для загрузки растрового изображения в ImageView Получить каталог sdcard по adb Как я могу захватить весь вид в растровое изображение при использовании пешеходного перехода для отображения веб-страницы? Сохранение состояния активности Android с использованием состояния Save Instance Как загрузить данные с сервера на список при прокрутке? Android: установить элемент списка списка как «выбранный» (выделено) Как я могу создать «Pulse» как пользовательский интерфейс для приложения Android Пауза для Android DownloadManager Проверка нарушений android: minSdkVersion автоматически Android c2dm автоматически незарегистрирован Android Unit Testing не работает для проекта библиотеки Android Как перейти в одно и то же родительское состояние Передача строки в C-код в Android NDK Недостаточно памяти при распределении курсоров Могу ли я разрабатывать Android для чего-то другого, кроме Java?

Тестирование этой кнопки запускает операцию с Robolectric

Привет У меня есть следующий код:

@RunWith(Test9Runner.class) public class MainActivityTest { private MainActivity activity; private Button pressMeButton; @Before public void setUp() throws Exception { activity = new MainActivity(); activity.onCreate(null); pressMeButton = (Button) activity.findViewById(R.id.button1); } @Test public void shouldUpdateResultsWhenButtonIsClicked() throws Exception { pressMeButton.performClick(); ShadowActivity shadowActivity = shadowOf(activity); Intent intent = shadowActivity.getResultIntent(); System.out.print(intent.toString()); } } 

Но я не знаю, как проверить, что нажатие pressMeButton начало новую активность. На самом деле это так, но как написать правильный тест модуля Robolectric для этого факта?

Solutions Collecting From Web of "Тестирование этой кнопки запускает операцию с Robolectric"

Использовать Robolectric's StartedMatcher

 @RunWith(Test9Runner.class) public class MainActivityTest { private MainActivity activity; private Button pressMeButton; @Before public void setUp() throws Exception { activity = new MainActivity(); activity.onCreate(null); pressMeButton = (Button) activity.findViewById(R.id.button1); } @Test public void shouldStartNextActivityWhenButtonIsClicked() { pressMeButton.performClick(); assertThat(activity, new StartedMatcher(NextActivity.class)); } } 

В Robolectric 2.1.1 вы можете проверить, был ли Intent запускающий новую Activity следующим образом.

 @RunWith(RobolectricTestRunner.class) public class MyTest { private ShadowActivity shadowActivity; private MyActivity activity; @Before public void setup() { activity = new MyActivity(); shadowActivity = Robolectric.shadowOf(activity); } @Test public shouldStartNewActivityWhenSomething() { //Perform activity startup //Do some action which starts second activity, for example View::performClick() //... //Check Intent Intent intent = shadowActivity.peekNextStartedActivityForResult().intent; assertThat(intent.getStringExtra(MySecondActivity.EXTRA_MESSAGE)).isEqualTo("blebleble"); assertThat(intent.getComponent()).isEqualTo(new ComponentName(activity, MySecondActivity.class)); } } . @RunWith(RobolectricTestRunner.class) public class MyTest { private ShadowActivity shadowActivity; private MyActivity activity; @Before public void setup() { activity = new MyActivity(); shadowActivity = Robolectric.shadowOf(activity); } @Test public shouldStartNewActivityWhenSomething() { //Perform activity startup //Do some action which starts second activity, for example View::performClick() //... //Check Intent Intent intent = shadowActivity.peekNextStartedActivityForResult().intent; assertThat(intent.getStringExtra(MySecondActivity.EXTRA_MESSAGE)).isEqualTo("blebleble"); assertThat(intent.getComponent()).isEqualTo(new ComponentName(activity, MySecondActivity.class)); } } 

Это похоже на то, что я делаю. Обратите внимание, что создание Activity , вызвав new Activity() , сделает предупреждения Robolectric о том, что вы создаете активность ненадлежащим образом, возможно, это может быть сделано лучше …

Вдохновленный ответом @ MichK, вот полный тестовый тест, используя buildActivity методов buildActivity от Robolectric 2.2+:

 @Test public void testStartScheduleActivity() { HomeScreenActivity homeActivity = Robolectric.buildActivity(HomeScreenActivity.class).create().start().visible().get(); ShadowActivity shadowHome = Robolectric.shadowOf(homeActivity); Button btnLaunchSchedule = (Button) homeActivity.findViewById(R.id.btnLaunchSchedule); Robolectric.clickOn(btnLaunchSchedule); assertThat(shadowHome.peekNextStartedActivityForResult().intent.getComponent(), equalTo(new ComponentName(homeActivity, ScheduleActivity.class))); } 

Обновление этого для 3.1.2, поскольку ответы выше не работали для меня:

  loginButton.callOnClick(); Intent startedIntent = shadowOf(activity).getNextStartedActivity(); ShadowIntent shadowIntent = shadowOf(startedIntent); assertEquals(NextActivity.class, shadowIntent.getIntentClass()); 
 @Before public void setUp() throws Exception { mMainActivity = Robolectric.buildActivity(MainActivity.class) .create().start().visible().get(); shadowActivity =Shadows.shadowOf(mMainActivity); hourlyButton = (Button) mMainActivity.findViewById(R.id.hourlyButton); } 

@Test public void hourlyActivityButtonTest () throws Exception {

  Thread.sleep(5000); hourlyButton.performClick(); Intent intent = shadowActivity.peekNextStartedActivityForResult().intent; assertThat(intent.getComponent()).isEqualTo(new ComponentName(mMainActivity, HourlyForecastActivity.class)); } 

Вот как это выглядит для Robolectric 3

  // Click on the image view mShareLocationImageView.performClick(); // Check the startActivityForResult for ShareUserLocationActivity has been triggered ShadowActivity shadowActivity = Shadows.shadowOf(mChatWindowsActivity); Intent intent = shadowActivity.peekNextStartedActivityForResult().intent; assertThat(intent).hasComponent(new ComponentName(mChatWindowsActivity, ShareUserLocationActivity.class)); 

Не использовав ни одного из модульных тестов в android, я не уверен, что это сработает:

В действии, которое вы запускаете, вы можете создать статическую переменную, называемую «экземпляр».

 private static TheActivitysName instance; 

В действии onCreate вы задаете переменную экземпляра:

 instance = this; 

И затем вы создаете статический метод для получения этой переменной.

 public static TheActivitysName getInstance() { return instance; } 

В своем тесте вы можете проверить на TheActivitysName.getInstance (). Если он равен нулю, активность не запускается. Если он отличается от нуля, то действие было создано.

Я не уверен, будет ли проверяться код, прежде чем действие еще успело создать.