Предоставление файлов-заглушек через URL-адреса в тестах junit - wiremock

Сценарий у нас есть:-

У нас есть модуль (в java) для тестирования с помощью Junit. Модуль в основном принимает файлы в качестве входных данных, обрабатывает их, а затем записывает данные в Hazelcast. Эти входные файлы загружаются с внутреннего URL-адреса.

В нашем тесте Junit (полностью отдельный тестовый проект, т. е. тест junit не находится в тестируемом модуле), у нас нет доступа к этому URL-адресу, где находятся эти файлы.

Проблема:-

-> Для предоставления входных файлов Модулю используется файл .properties, в котором указано, где он физически находится. которое является полем InputFileUrl в самом модуле.

-> Где-то в модуле этот URL будет прочитан (из файла .properties), а затем к нему будут добавлены некоторые дополнительные параметры. а затем модуль пытается назвать это URL-адресом и загружает входные файлы. Из тестового проекта у нас нет доступа к этому URL. поэтому мы предоставляем этим входным файлам следующий статический адрес файла:

InputFileUrl = file:///C:/Inputs/file.xml

-> Проблема в том, что когда некоторые дополнительные параметры добавляются к указанному выше URL-адресу в модуле, естественно, он становится недействительным URL-адресом и выдает исключение. Мы могли бы успешно запустить модуль из нашего тестового проекта, если бы мы сделали часть комментариев модуля, где были добавлены эти дополнительные параметры. (только однострочный комментарий)

Итак, 1) как мы можем решить эту проблему доступа к URL-адресу без изменения самого кода модуля?

Может ли здесь быть полезна технология WireMock? Я немного читал об этом и не уверен, что это может быть полезно для этого сценария, поскольку здесь внутренний URL-адрес для тестируемого модуля будет высмеиваться.


person Ragini    schedule 13.12.2017    source источник


Ответы (1)


Да, с помощью Wiremock вы можете настроить сервер-заглушку, который отвечает XML-файлом, который вы хотите предоставить своему модулю. Итак, для теста вы бы установили

InputFileUrl = http://<wiremockurl>

wiremockurl обычно является «localhost», хотя вы можете запускать wiremock автономно с фиксированным IP-адресом/доменным именем.

Затем заглушка работает следующим образом:

stubFor(get(urlEqualTo("/api/specific-resource"))
    .willReturn(aResponse()
        .withBody("<xml1>..<xml1>")));

Как вы можете прочитать в документации wiremock, вы можете вернуть один и тот же ответ для многих дополнительных параметры запроса или настроить определенный ответ для определенных дополнительных параметров запроса.

// responds with same response regardless of query params
.urlEqualTo("/myurl\?.*")

// responds with special xml if additional query param "search_term" is present and matches given regex
.withQueryParam("search_term", matches("^(.*)wiremock([A-Za-z]+)$"))

Вы можете настроить wiremock для ответа с теми же или другими свойствами, если модуль добавляет дополнительные параметры URL.

person tkruse    schedule 14.12.2017
comment
Спасибо за ответ, tkruse. Но мне просто интересно, что произойдет, когда в самом модуле к URL-адресу будут добавлены дополнительные параметры? Я имею в виду метод в модуле, например. getInputFileUrl() вернет мой имитированный URL-адрес, а затем метод попытается добавить к нему дополнительные параметры (согласно коду метода в модуле). Как мне контролировать/избегать этого в моем тесте? getInputFileUrl не вызывается из моего теста явно, но вызывается где-то внутри... - person Ragini; 14.12.2017
comment
Я добавил больше деталей - person tkruse; 15.12.2017