Интеграция с эспрессо Wiremock

Я разработал небольшое приложение с экраном входа в систему, а также написал сценарий Espresso для его автоматизации.

Я знаю, что WireMock — это гибкая библиотека для заглушек и имитации веб-сервисов. С его помощью можно создать фактический HTTP-сервер, чтобы ваш тестируемый код мог подключаться к нему, как к реальному веб-сервису.

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

Я использую инструмент ниже.

  • Android-студия
  • Эспрессо
  • Инструмент сборки Gradle

person Dinesh Chandra    schedule 18.09.2015    source источник
comment
Вот связанный доклад, который я сделал об использовании wiremock на Android. youtube.com/watch?v=-xQCNf_5NNM   -  person yogurtearl    schedule 06.10.2015
comment
Спасибо @yogurtearl. Я смотрел видео. Это действительно полезно, и мы начали его реализовывать.   -  person Dinesh Chandra    schedule 09.10.2015
comment
Динеш, в видео @yogutearl он упомянул, что вам нужно возиться/модифицировать WireMock, чтобы заставить его работать на Android. С последней версией 2.0.8-бета вы можете использовать ее без изменений. Я подробно расскажу, как получить эту настройку в другом ответе на переполнение стека: stackoverflow.com/a/34657479/509081   -  person Sam Edwards    schedule 07.01.2016


Ответы (3)


Отказ от ответственности: я разработчик Java и никогда не разрабатывал Android.

Это действительно то, что вы хотите сделать? Почему бы не обернуть ваши вызовы веб-сервиса в класс с интерфейсом? (используя jaxrs или аналогичный). Тогда тестирование может быть намного проще, поскольку вы можете смоделировать старый простой интерфейс (используя mockito или что-то подобное).

Преимущество этого подхода в том, что тесты будут «быстро завершаться ошибкой», если интерфейс веб-службы изменится несовместимым образом (поскольку тесты больше не будут компилироваться).

Насмешка над http-запросом/ответом все время звучит многословно и сложно в обслуживании по сравнению с насмешкой над интерфейсом.

person lance-java    schedule 18.09.2015
comment
Ваше предложение действительно для некоторых уровней тестирования. Однако, если вы хотите протестировать свое приложение в чистом виде (за исключением другой конечной точки URL), то WireMock позволяет вам это сделать. Это особенно полезно при тестировании Android Espresso, поскольку пользовательский интерфейс вашего приложения управляется автоматическими командами пользовательского интерфейса, и вы хотите протестировать свое приложение как можно ближе к финальной версии. - person Sam Edwards; 07.01.2016

Вы можете просто запустить wiremock из своего приемочного модульного теста следующим образом:

@Rule
public WireMockRule wireMockRule = new WireMockRule(options().port(PORT).notifier(new ConsoleNotifier(true)));

@Rule
public ActivityTestRule<T> activityRule = new ActivityTestRule<T>(type) {
        @Override
        protected void beforeActivityLaunched() {
            stubFor(get(urlPathEqualTo("/myUrl"))
            .willReturn(aResponse()
                    .withStatus(200)
                    .withBody("{ 'status': 'OK' }")));
        }
    };

@Before
public void before() {
    activityRule.getActivity();
}

@Test
public void test() {
    // using espresso trigger the call on your activity
}

Я предположил, что у вас есть эспрессо, и вы знаете, как его использовать. Обратите внимание, что заглушка должна быть в методе beforeActivityLaunched, в противном случае, если активность делает несколько вызовов при запуске, заглушки еще не будут готовы.

person kazuar    schedule 14.10.2016

Я хотел бы добавить к предыдущим ответам и предложить использовать Wiremock JAX-RS (отказ от ответственности : я автор). Это позволяет вам автоматизировать заглушки, если вы выражаете свой интерфейс с помощью JAX-RS.

Он добавляет метод WireMockJaxrs.invocation(...), который используется следующим образом:

final List<ItemDTO> responseObject = Arrays.asList(new ItemDTO("pong"));
final StubMapping sm =
    stubFor( //
        invocation(ItemResouce.class, (r) -> r.getItems()) //
            .willReturn(aResponse().withStatus(SC_ACCEPTED), responseObject));
person Tomas Bjerre    schedule 23.04.2019