Подтвердить что ты не робот

Mocking library/framework, который лучше всего работает в Android?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Недавно я выпустил Borachio, родную Scala mocking framework, которая работает на 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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 7

Я только что попробовал Android-Mock. До сих пор он очень хорошо работает. Он разрешил мою проблему (либо использовать AndroidTestCase без EasyMock, либо использовать EasyMock, но не разрешен контекст)