Насмешливая библиотека / фреймворк, который лучше всего работает в Android? - PullRequest
35 голосов
/ 26 июля 2010

Я разрабатываю приложение для Android с использованием сторонних библиотек (Twitter4j). Я хочу иметь возможность макетировать эти объекты (также созданные мной объекты) в JUnit и функциональных тестах.

Есть ли у вас какие-либо хорошие примеры использования библиотек-насмешников, и вы можете порекомендовать их?

Ответы [ 7 ]

37 голосов
/ 05 августа 2010

(Обновление: Mockito добавил поддержку Android начиная с версии 1.9.5, а EasyMock добавил поддержку Android начиная с версии 3.2, выделяя те биты, которые генерируют код во время выполнения, и делая их подключаемыми, например, используя вместо этого dexmakerиз cglib.)

За исключением android-mock , упомянутого DixonD (довольно молодой, непроверенной библиотеки), в настоящее время нет решения.Вы можете сразу забыть что-нибудь на основе CGLib ( Mockito , обычный EasyMock ), поскольку CGLib полагается на генерацию байтового кода и не будет работать на Dalvik (он также опирается на пакет Java Beans, который также не является частью Android).

Для того, чтобы это стоило, вы могли бы использовать очень немного ложных классов, поставляемых с Android (например, MockContext ), но они не проверяют поведениеони просто окурки.Их поведение по умолчанию состоит в том, чтобы выдавать ошибку времени выполнения в каждом методе, поэтому вы должны разделить их на подклассы и переопределить методы, которые вы хотите смоделировать.

Однако вы все равно можете использовать библиотеки-насмешки в неинструментальных тестах, то есть вваши стандартные юнит-тесты, выполненные на JVM.Вы можете использовать PowerMock для моделирования методов фреймворка, он поддерживает моделирование статических методов и конструкторов, что делает его таким же мощным, как, например, в Ruby (просто более болезненным в использовании).

Мы используемJUnit 4 + PowerMock + Mockito и макет классов, таких как Context и TextUtils, в базовом классе, от которого мы наследуем каждый обычный тест JUnit.Для инструментальных тестов мы создаем пользовательские фиктивные классы и решаем, используя фабрику, какую реализацию (имитировать или нет) создавать во время выполнения.

7 голосов
/ 13 марта 2011

Я недавно выпустил Borachio, нативную фреймворк Scala для работы с Android.

Поскольку Borachio написан на Scala, вам нужно будет написать свои тесты на Scala. Но его можно использовать для тестирования кода, написанного на Java.

В моем блоге есть описание того, как использовать Borachio на Android:

http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-1/ http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-2/ http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-3/

UPDATE:

Borachio теперь ScalaMock .

3 голосов
/ 02 февраля 2013

Robolectric использует другой подход. Вместо запуска на DVM он «расчищает» Android SDK, так что вы можете запускать тесты Android непосредственно на JVM с помощью инфраструктуры JUnit4. По-видимому, тесты создаются и выполняются намного быстрее и требуют меньше насмешек.

[Общий подход] заключается в использовании фиктивных сред, таких как Mockito или Android Mock, чтобы издеваться над Android SDK. Хотя это действительный подход, мы обнаружили, что без Robolectric, уровень издевательство, необходимое для быстрого тестирования Android-приложения, дает тесты, которые по существу, обратная реализация кода приложения.

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

Вот как это работает:

[Он перехватывает] загрузку Android-классы и переписывание тел методов. Robolectric переопределяет методы Android, чтобы они возвращали ноль (или 0, ложь и т. д.), или если предусмотрено, Robolectric будет перенаправлять вызовы методов в теневой Android объекты, дающие поведение Android SDK.

Сравнение с Mockito .

1 голос
/ 28 августа 2012

Lmock работает на Android: github.com / vmware / lmock

1 голос
/ 19 мая 2011

обновление: похоже, что easymock 3.2 добавил опцию для вставки альтернатив для cglib.

Я использую easymock 2.5.2 (примечание - не используйте 3.X),это работает - но только для ложных интерфейсов .

Таким образом, если ваша библиотека предоставляет интерфейсы или если вы хотите обернуть наши зависимости интерфейсами, вы можете использовать easymock.

Более поздние версии easymock, такие как easymock 3.x , не будут работать , потому что они используют несовместимый с android cglib для манипулирования байт-кодом как для классов, так и для интерфейсов, в то время как 2.x использует его только для имитацииклассы.

1 голос
/ 04 августа 2010

Android Mock написан поверх EasyMock 2.4 , который является известным фреймворком для Java

0 голосов
/ 23 сентября 2011

Я только что попробовал Android-Mock.Пока это работает очень хорошо.Это решило мою проблему (либо используйте AndroidTestCase без EasyMock, либо используйте EasyMock, но контекст не поддерживается)

...