Intereting Posts
Разрешение отказа при попытке доступа к контактам в Android Устанавливать значок запуска на главном экране один раз Операторы RxJava Плавающие кнопки действий, исчезающие при прокрутке Получить реальный путь для Uri Android Com.android.ddmlib.InstallException: не удалось установить сеанс реагирования Как обрабатывать ошибки в пользовательском AsyncTaskLoader? Вызов Gradle из .bat приводит к остановке пакетного выполнения Как я могу генерировать случайное число в диапазоне в Android и показывать его в поле textView, пользователь выбирает max no и min no? Библиотека выравнивания текста в Java Android Spinner OnItemSelected не вызывается с тем же элементом Action Bar Шерлок SearchView не расширяется по щелчку Как выбрать видео из галереи и обрезать / изменить его размер так же, как обрезка изображения в андроиде OnGlobalLayoutListener: устаревание и совместимость NoSuchMethodError, если я использую okhttp 2.0 и последнюю модификацию?

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

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