Отказывание результатов сервера на Android (Wiremock, MockWebServer и т. Д.)

У кого-нибудь есть полный и недавний учебник или проект по записи ответов сервера – получить и отправить и заголовки по мере необходимости И воспроизвести их с помощью wiremock и / или mockwebserver?

Я уже посмотрел на многие из них

    Я реализовал его в своем текущем проекте. Прежде всего, я создал класс MockHTTPDispatcher который расширяет класс Dispatcher от OkHttp3. Матчи здесь импортируются из Hamcrest .

     public class MockHTTPDispatcher extends Dispatcher { private Map<Matcher<RecordedRequest>, MockResponse> requestResponseMap; public MockHTTPDispatcher() { requestResponseMap = new HashMap<>(); } public MockHTTPDispatcher mock(Matcher<RecordedRequest> matcher, MockResponse mockResponse) { requestResponseMap.put(matcher, mockResponse); return this; } @Override public MockResponse dispatch(RecordedRequest recordedRequest) { String recordedRequestPath = recordedRequest.getPath(); for (Matcher<RecordedRequest> mockRequest : requestResponseMap.keySet()) { if (mockRequest.matches(recordedRequest)) { MockResponse response = requestResponseMap.get(mockRequest); return response; } } //means unable to find path for recordedRequestPath return new MockResponse().setResponseCode(404); } //you can also create a clear() method to clear the requestResponseMap if needed } 

    Затем я создал класс MockWebServerRule который реализует TestRule . Этот кусок кода будет охватывать случай, когда вы хотите установить заголовки, а когда нет.

     public class MockWebServerRule implements TestRule { public static final String DOMAIN = "localhost"; public static final int PORT = 4567; private MockHTTPDispatcher mockHTTPDispatcher; private MockWebServer mockWebServer; public MockWebServerRule() { mockWebServer = new MockWebServer(); mockHTTPDispatcher = new MockHTTPDispatcher(); mockWebServer.setDispatcher(mockHTTPDispatcher); } @Override public Statement apply(Statement statement, Description description) { return new MockHTTPServerStatement(statement); } public void mockResponse(String path, String httpMethod, int httpResponseCode, String response) throws Exception { mockResponseWithHeaders(path, httpMethod, httpResponseCode, response, null); } public void mockResponseWithHeaders(String path, String httpMethod, int httpResponseCode, String response, Headers headers) throws Exception { mock(allOf(pathStartsWith(path), httpMethodIs(httpMethod)), httpResponseCode, response, headers); } public void mock(Matcher<RecordedRequest> requestMatcher, int httpResponseCode, String response, Headers headers) throws IOException { MockResponse mockResponse = new MockResponse() .setResponseCode(httpResponseCode) .setBody(response); if (headers != null) mockResponse.setHeaders(headers); mockHTTPDispatcher.mock(requestMatcher, mockResponse); } public MockHTTPDispatcher getDispatcher() { return mockHTTPDispatcher; } //inner class for starting and shutting down localhost private class MockHTTPServerStatement extends Statement { private Statement base; public MockHTTPServerStatement(Statement base) { this.base = base; } @Override public void evaluate() throws Throwable { mockWebServer.start(PORT); try { this.base.evaluate(); } finally { mockWebServer.shutdown(); } } } } 

    Для httpMethodIs и pathStartsWith вам нужно создать такой метод, как это (я создал класс с именем RequestMatchers для них).

      public static Matcher<RecordedRequest> httpMethodIs(final String httpMethod) { return new TypeSafeMatcher<RecordedRequest>() { @Override protected boolean matchesSafely(RecordedRequest item) { return httpMethod.equals(item.getMethod()); } @Override public void describeTo(org.hamcrest.Description description) { description.appendText("getMethod should return"); } }; } 

    А также

      public static Matcher<RecordedRequest> pathStartsWith(final String path) { return new TypeSafeMatcher<RecordedRequest>() { @Override protected boolean matchesSafely(RecordedRequest item) { return item.getPath().startsWith(path); } @Override public void describeTo(org.hamcrest.Description description) { description.appendText("getPath should return"); } }; } 

    В вашем контрольно-измерительном тесте вы можете вызвать правило mock webserver с помощью аннотации @Rule же, как это:

     public class YourActivityTest { @Rule public MockWebServerRule mockWebServerRule = new MockWebServerRule(); @Test public void shouldHandleResponse200() throws Exception { mockWebServerRule.mockResponse("/your/api/endpoint/", "GET", 200, readAsset("response_success.json")); //your assertion here } } 

    Вы можете просто изменить "GET" на "POST" или что-нибудь еще с ожидаемым ответом кода состояния. Не забудьте добавить реализацию readAsset(String fileName) где-нибудь в вашем коде, чтобы он мог читать активы json, которые вы сохранили.

    Intereting Posts
    Какое ключевое слово используется в этом примере кода? Где поместить REST API в чистую архитектуру дяди Боба? Невозможно прочитать имя пакета из AndroidManifest.xml Как пользоваться профилем PROXIMITY PROFILE, IMMEDIATE ALERT SERVICE и Find Me Profile в android 4.3 BLE? После обновления APK поддерживает меньше устройств, чем ранее Переопределить applicationatoinID внутри манифеста проекта библиотеки с помощью Gradle Google API для Документов Google, запрашивающих список документов – 400 Bad Request Сбой приложения с защитой Proguard Удобство использования BoringLayout Xamarin Forms Android Проблемы, пакет android.support.design. * Не существует Отслеживание сетевой статистики приложения (netstats) с использованием ADB Android: Как использовать Список массивов строк внутри строки списка Очистить фокус EditText, когда кнопка возврата нажата, когда отображается экранная панель Почему нулевой фрагмент в backstack Уведомление о подключении Android