Издевательство над приложениями для Android, такими как приложение для контактов, с помощью Mockito

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

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

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

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

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


person Satyam    schedule 28.06.2012    source источник


Ответы (2)


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

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

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

doReturn(fakeIntent).when(mockActivity).startActivityForResult(any(Xxx.class),anyInt());
person Dawood ibn Kareem    schedule 29.06.2012

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

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

я описал полный процесс здесь.

person Thomas Keller    schedule 09.10.2013