Модульные тестовые случаи с JUnit + (Robolectric или Mockito или оба в Android)

Это первый раз, когда мне приходится писать модульные тесты в Android.

Так что я искал много вещей.

  1. Robolectric framewordk — работает на JVM
  2. Mockito Framwork — имитация объектов

Так что у меня есть некоторые сомнения в Robolectric и Mokito.

  1. Должен ли я использовать Robolectric только с JUnit в приложении для Android?
  2. Должен ли я использовать Mockito только с JUnit в приложении для Android?
  3. Должен ли я идти с обеими рамками?
  4. В чем разница между Mockito и Robolectric?

Я ищу разницу между Mokito и Robolectric, но не получаю на это правильного ответа.

Пожалуйста, предложите.


person Deepanker Chaudhary    schedule 09.06.2016    source источник


Ответы (3)


У них немного разное использование, и я склонен использовать оба в своих проектах.

Мокито

используется для создания макетов ваших классов.

Когда вы тестируете определенный класс, вы имитируете все его зависимости с помощью Mockito.

По возможности большинство ваших тестов должны использовать mockito. Чтобы сделать это возможным, большинство людей разбивают свой код на MVP и т. д., где бизнес-логика отделена от логики представления. Таким образом, ваша бизнес-логика (Presenter) не имеет знаний (или зависимостей) о библиотеке Android и не нуждается в их макетах.

Робоэлектрик

— это библиотека, содержащая множество макетов классов Android.

Средство запуска тестов Robolectric внедряет эти «теневые объекты» вместо реальных классов Android при запуске тестов. Именно это позволяет запускать тесты на JVM без загрузки экземпляра Android.

При использовании MVP ваш уровень представления, как правило, реализуется с помощью действия/фрагмента, и именно здесь вы можете использовать Robolectric для их имитации.

Примечания

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

Вам также может понадобиться другая библиотека, например PowerMock. Это позволяет имитировать статические классы, такие как Math, или может использоваться для имитации статических классов Android, таких как TextUtils.

Оба используются с JUnit

person Jahnold    schedule 09.06.2016
comment
У меня есть Activity & Fragment, поэтому для этого я буду использовать robolectric, а для своих классов моделей, связанных с веб-сервисами, я буду использовать mockito. Верно? - person Deepanker Chaudhary; 09.06.2016
comment
Ну, это может быть не так ясно, но да, это общая идея. - person Jahnold; 09.06.2016
comment
Взгляните на тесты для этого примера приложения, которые могут дать вам некоторые идеи: github.com/emmaguy /rxjava-mvp-giphy - person Jahnold; 09.06.2016
comment
Как говорит Джанольд, Robolectric — это библиотека, которая заменяет специфичные для Android библиотеки. Вы делаете это для того, чтобы выполнить модульное тестирование на вашем ПК или платформе Linux, используя виртуальную машину Java. Если вы выполняете свои модульные тесты на эмуляторе или на Android-устройстве, подключенном через USB, вы не используете Robolectric. Mockito — это фреймворк для замены модулей в вашей системе, которые вы не хотите использовать во время модульного тестирования другого модуля — мы говорим, что вы издеваетесь над зависимым модулем. - person Robert R Evans; 10.06.2016
comment
Эй, спасибо за информацию, я запутался в проведении теста с Junit + Roboectric. В основном из-за этой строки @RunWith(AndroidJUnit4.class) в верхней части тестового класса. Так должен ли он работать с Junit или с robo? - person Doug Ray; 17.08.2016
comment
@DougRay его следует запускать с Robolectric. Robolectric — это JUnit «Test Runner», что в основном означает, что он находится поверх JUnit. Если вам нужно больше рекомендаций, возможно, стоит задать свой вопрос. - person Jahnold; 23.08.2016
comment
@Jahnold спасибо, я попробую провести несколько тестов на Roboeletric Test Runner. - person Doug Ray; 24.08.2016
comment
@Jahnold Мне нужно запустить тестовый пример, чтобы выполнить сервисный уровень в моем приложении для Android. Итак, какая структура идеальна? Робоэлектрик. или Mockito, а позже это будет целое приложение. iherad для тестирования пользовательского интерфейса Эспрессо идеально подходит - person Mr.G; 14.07.2017

Один только Mockito может покрыть большинство случаев.

Однако Robolectric также может предоставлять ограниченные операции над компонентом Android, такие как Activity или Fragment в Unit Test (не инструментальный тест, который не зависит от Android SDK), который не требует эмулятора или устройств и значительно быстрее, чем инструментальные испытания.

Мое предложение: используйте Mockito для модульного тестирования и Espresso для тестирования пользовательского интерфейса, поскольку они являются полуофициальными тестовыми фреймворками для Android.

Добавьте Robolectric в модульный тест, если есть зависимости от Android SDK.

person Eric Liu    schedule 09.06.2016
comment
У меня есть активность и фрагменты, а также веб-сервисы. я должен делать только модульное тестирование, а не инструментальное. Итак, я понимаю robolectric, но я не очень представляю, где я буду использовать robolectric или где mockito. или mockito будет использоваться только для классов моделей? - person Deepanker Chaudhary; 09.06.2016
comment
В дополнение к этому и к вашему комментарию: если ваш уровень бизнес-логики полностью независим от Android Framework, вам следует использовать JUnit с Mockito, только если ваш уровень бизнес-логики имеет зависимости от Android Framework, тогда вам нужно использовать Roboelectric. - person Talha; 09.03.2018

Прежде всего, нам нужно понять, что Roboelectric и Mockito — это два разных инструмента, обычно используемых в Android Test Driven Development. Так что в основном вы найдете оба инструмента в одном проекте.

Ниже я объясню общие варианты использования для обоих:

Mockito используется для имитации зависимости, что означает, что если вы хотите получить доступ к реальному объекту в тестовой среде, вам нужно подделать его или, можно сказать, смоделировать его. Теперь с Mockito стало намного проще издеваться над объектами.

Roboelectric – это стандартная платформа модульного тестирования для Android. С Robolectric ваши тесты выполняются в смоделированной среде Android внутри JVM без накладных расходов на эмулятор. Простой тест, написанный с использованием roboelectric,

`@RunWith(AndroidJUnit4.class)
public class MyActivityTest {
@Test
public void clickingButton_shouldChangeResultsViewText() throws Exception {
Activity activity = Robolectric.setupActivity(MyActivity.class);

Button button = (Button) activity.findViewById(R.id.press_me_button);
TextView results = (TextView) activity.findViewById(R.id.results_text_view);

button.performClick();
assertThat(results.getText().toString(), equalTo("Testing Android Rocks!"));
}
}`
person Shivam Yadav    schedule 13.11.2019
comment
Я просто хотел спросить, почему кинжал необходим в модульном тестировании? Внедрение других функциональных зависимостей в модуль больше не является модульным тестом. Если в тесте требуются другие зависимости, не следует ли его называть интеграционным тестом? Довольно новичок в модульном тестировании и не знаю, что есть что. Если целью кинжала является внедрение фиктивной зависимости в модульный тест, не проще ли просто издеваться над ней? - person gmatcat; 05.01.2021