2012-06-28 6 views
1

Я пытаюсь написать функциональные тесты для приложения для Android. Проблема в том, что большинство функциональных тестов, которые я изучил (calabash-android, robotium), имеют ограничение на количество действий из разных приложений, которые могут быть протестированы в одном и том же тесте. Поэтому, если в одном рабочем процессе мне нужно выбрать некоторые контакты из панели выбора android, я не могу проверить весь поток, потому что активность выбора контактов является частью приложения для контактов android, и среда не может проверять активность из моего приложения и приложения контактов в то же время.Mocking приложения для Android, как приложение для контактов, используя Mockito

Одним из возможных решений, которое, по мнению моей команды, было издеваться над вызовом активности контактов, чтобы вернуть фиктивные намерения с контактной информацией, чтобы можно было проверить наш рабочий процесс. Мы пытаемся использовать mockito для достижения этого. Однако я застрял довольно рано. Вот то, что я пытаюсь сделать

MyActivity mockActivity = mock(MyActivity.class); 
when(mockActivity.startActivityForResult(<?>,anyInt())).thenReturn(fakeIntent); 

Я не уверен, что ставить в первом параметре во второй строке. Я пробовал Intent.class и android.content.Intent.class, однако он выдает ошибку компиляции. Если кто-то работал с издевательскими действиями с использованием mockito, то с этой помощью будет очень благодарна.

P.S. - Если я правильно понимаю, насмехается, больше используется в модульном тестировании, чем функциональное тестирование. Таким образом, эти тесты были бы скорее гибридом. Если у кого-то есть лучшее предложение о том, как пройти эти функциональные тесты на андроиде, я все уши.

ответ

0

Трудно ответить на этот вопрос, не зная подписи вашего метода startActivityForResult, но общая идея заключается в использовании any(Xxx.class), где Xxx - это тип параметра. Так как

when(mockActivity.startActivityForResult(any(Xxx.class),anyInt())).thenReturn(fakeIntent); 

или (вид эквивалент)

doReturn(fakeIntent).when(mockActivity).startActivityForResult(any(Xxx.class),anyInt()); 
0

Вопрос заключается в том, что вы не можете на самом деле «фиктивный» (на самом деле «шпион») на активность вы проверяете, так как он создается вне вашего контроля с помощью инструментального кода Android. В среде с единичным тестированием, где у вас будет контроль, вы можете следовать по пути mock(MyActivity.class) или spy(myActivityInstance) (шпион на самом деле был бы лучше, потому что вы могли бы использовать большую часть первоначальной реализации активности), но здесь нет.

Единственное решение, которое я нашел для этой дилеммы, состояло в том, чтобы переместить определенную функциональность из активности в классы полезности, в идеале используя roboguice для этого (@ContextSingleton s можно использовать для обработки результатов деятельности). Затем, в своем тестовом проекте, вы создадите свой собственный тестовый визуальный инжектор, установите его как базовый инжектор приложения, прежде чем вы вызовете getActivity() в первый раз, а затем дайте активности работать над вашим издеваемым классом утилиты.

I outlined the complete process here.

Смежные вопросы