После рассмотрения проблемы мы обнаружили, что служба S / 4HANA в фоновом режиме не работает должным образом.
Дальнейшие ссылки. Я опишу способ понять, что происходит под капотом OData VDM.
Отображение HTTP-вызовов
Чтобы увидеть, какие HTTP-запросы выполняет OData VDM, мы создадим тест, который устанавливает и отключает локальный фиктивный сервер, на который будут отправляться запросы. Для этого мы используем Wiremock .
Предпосылки
Единственным предварительным условием для этого является загрузка файла метаданных службы, с которой вы хотите проверить. Вы можете получить это, используя конечную точку $metadata
вашей целевой системы.
Для PhysicalInventoryDocumentService
это может выглядеть примерно так:
https://myserver.com/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV/$metadata
Путь можно найти в сервисном интерфейсе вашего сервиса для проверки. В этом примере вы найдете его в PhysicalInventoryDocumentService
:
public interface PhysicalInventoryDocumentService
{
// ...
String DEFAULT_SERVICE_PATH = "/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV";
// ...
}
Настройка теста
Создайте нормальный тестовый класс внутри вашей тестовой директории (SomeTest
в этом примере).
Переместите файл метаданных, который вы загрузили на предыдущем шаге, в каталог ресурсов-тестов в подкаталоге, названном после теста. Так что в моем примере у меня есть следующая структура: src->test->resources->SomeTest->API_PHYSICAL_INVENTORY_DOC_SRV.edmx
.
В вашем тестовом классе добавьте следующие строки на уровне класса:
private static final MockUtil mockUtil = new MockUtil();
@Rule
public final WireMockRule erpServer = mockUtil.mockErpServer();
Это будет для каждого метода тестирования настроить фиктивный сервер, выполнить код и, наконец, снова отключить сервер. MockUtil
можно найти в библиотеке com.sap.cloud.s4hana:testutil
S / 4HANA Cloud SDK.
Затем добавьте следующий setUp
метод:
@Before
public void setUp()
{
final String metadataAsString =
TestUtil.readResourceFile(SomeTest.class, "API_PHYSICAL_INVENTORY_DOC_SRV.edmx");
stubFor(
get(urlEqualTo("/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV/$metadata"))
.willReturn(okXml(metadataAsString)));
}
Там вам нужно заменить имя класса, имя файла метаданных и URL-адрес вашего сервиса.
Эти строки сообщат фиктивному серверу вернуть метаданные, если запрос получен по указанному URL.
Поскольку это первый шаг при каждом вызове OData VDM, его необходимо смоделировать.
Теперь создайте метод теста следующим образом:
@Test
public void testSomething()
throws ODataException
{
new DefaultPhysicalInventoryDocumentService().getAllPhysInventoryDocItem().execute();
}
Вам необходимо заменить вызов на тот, который вы хотите на самом деле проверить / подтвердить.
Выполнить тест
Если вы запустите тест, вы получите сообщение об ошибке, содержащее следующую таблицу:
[qtp1038820134-18] ERROR WireMock -
Request was not matched
=======================
-----------------------------------------------------------------------------------------------------------------------
| Closest stub | Request |
-----------------------------------------------------------------------------------------------------------------------
|
GET | GET
/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV/$metada | /sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV/A_PhysI<<<<< URL does not match
ta | nventoryDocItem?$format=json
|
|
-----------------------------------------------------------------------------------------------------------------------
Это обычный ответ Wiremock, если сервер получил запрос, который не был проверен. Слева вы видите ближайший смоделированный запрос, а справа - фактически полученный запрос.
Теперь вы можете использовать запрос справа через Почтальон или через браузер и напрямую проверить поведение.