Wiremock возвращает 404 для URL-адреса с заглушкой

Я определил сервер wireMock следующим образом:

    private WireMockServer wireMockServer;
        @Before
        public void preSetup() throws Exception {
          wireMockServer = new WireMockServer(56789);
          wireMockServer.start();
        };

        @Override
        @After
        public void tearDown() {
          wireMockServer.stop();
        }

        @Test
        public void testSendMatchingMessage() throws Exception {

          wireMockServer.stubFor(get(urlEqualTo("/orders/v1/ordersearch/"))
            .willReturn(aResponse().withStatus(200).withBody("<response>Some content</response>")));

       }

Но всякий раз, когда я нажимаю URL-адрес, что-то вроде ниже

http://0.0.0.0:56789/orders/v1/ordersearch/?field=address%2Cfinance%2Cshipping&limit=10&page=2&q=createdFrom.gt%7E2016-01-11T10%3A12%3A13

Я получаю следующую ошибку: -

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
    <title>Error 404 NOT_FOUND</title>
    </head>
    <body><h2>HTTP ERROR 404</h2>
    <p>Problem accessing /__files/orders/v1/ordersearch/. Reason:
    <pre>    NOT_FOUND</pre></p><hr /><i><small>Powered by Jetty://</small></i><br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>                                                
    <br/>     
    </body>
    </html>

Может ли кто-нибудь сообщить мне, что я делаю неправильно?


person tuk    schedule 05.03.2016    source источник


Ответы (4)


Согласно Stubbing - Wiremock (1-е место в Google по "wiremockserver urlequalto"):

Примечание: вы должны использовать urlPathEqualTo или urlPathMatching для указания пути, так как urlEqualTo или urlMatching попытаются сопоставить весь URL-адрес запроса, включая параметры запроса.

person ivan_pozdeev    schedule 05.03.2016

Для тех, кто пытается добавить Wiremock в приложение для Android и натыкается на этот вопрос:

Если вы запустите имитацию после выполнения сетевого вызова, она не сработает. Это может показаться очевидным, но я был сбит с толку.

Когда вы запускаете тест Espresso, по умолчанию правило теста активности сразу же запускает активность, поэтому активность запускалась и извлекала данные конфигурации до того, как мой фиктивный код был фактически запущен. Я видел ту же ошибку, что и OP.

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

person AdamMc331    schedule 25.03.2019

Я обычно использую urlPathMatching, который вы можете получить при импорте:

import static com.github.tomakehurst.wiremock.client.WireMock.*;

Таким образом, в вашем тесте у вас будет service класса MyService, который будет вызывать вызов внешнего API "/orders/v1/ordersearch/", который будет имитироваться с помощью wiremock stubFor.

Затем mockServer.verify, который mockServer сделал, получает доступ к внешнему API, когда служба service.sendToExternalUrl().

  private WireMockServer mockServer;
  private MyService service;

  @Before
  public void preSetup() {
    mockServer = new WireMockServer(56789);
    mockServer.start();
  }

  @After
  public void tearDown() {
    mockServer.stop();
  }

  @Test
  public void testSendMatchingMessage() {
    UrlPattern externalUrl = urlPathMatching("/orders/v1/ordersearch/");
    stubFor(get(externalUrl).willReturn(aResponse().withStatus(200)));

    service.sendToExternalUrl();

    mockServer.verify(1, getRequestedFor(externalUrl)
        .withRequestBody(containing(new JSONObject().put("orders", "results").toString())));
  }
person Sylhare    schedule 25.10.2019

Просто чтобы добавить другой сценарий, который в моем случае привел к той же проблеме:

убедитесь, что ничто другое не использует порт Wiremock.

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

person João Matos    schedule 27.11.2020