Intereting Posts
Запускать фоновое обслуживание в определенное время на Android Как получить имя (SSID) подключенной сети Wi-Fi через ADB? Предварительный просмотр камеры показывает нежелательные фрагменты только на Android 4.2.2 (S4, полный экран HD) Как отобразить пользовательский вид в ActionBar? Формат Android Chronometer Предотвращение слишком большого растрового изображения для добавления в текстуру android Могу ли я подавить перевод для определенной фразы в описании приложения в Google Play Store? Загрузчик не может быть перезапущен после изменения ориентации Правильно отключите объявления AdMob Можно ли просмотреть панель действий в графическом редакторе? Firebase / Android – Регулярное проигрывание соединения с базой данных Совместное использование кешированных изображений с помощью FileProvider Исключение NullPointer при использовании Espresso Ошибка: не удалось разрешить: annotationProcessor Traceview не может открыться из DDMS в eclipse

Тестирование этой кнопки запускает операцию с 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 (). Если он равен нулю, активность не запускается. Если он отличается от нуля, то действие было создано.

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