簡體   English   中英

VDM適用於一項Odata服務,不適用於另一項Odata服務

[英]VDM works for one Odata service, doesn't work for another

我試圖使用S4 SDK連接到S / 4 HANA Odata服務。 S / 4團隊為我們提供了兩項服務。 在相同的目的地,相似的代碼,與一種服務的集成有效,而與另一種服務的集成無效。

最好的祝福

使用的代碼是

final List<User> userList = new DefaultS4cUserMetadataService()
        .getAllUser()
        .select(
            User.USER, 
            User.BUSINESS_UNIT,
            User.COMPANY,
            User.COST_CENTER) 
        .filter(
            User.TIME_STAMP.ge(LocalDateTime.of(1970, Month.JANUARY, 1, 0, 0, 0)))
        .orderBy(User.USER, Order.ASC)
        .execute(configContext);
return userList;

我還調用了沒有select和filter的方法,但是它得到了相同的錯誤:代碼為500的內部錯誤。但是對於獲得業務角色的服務而言,它卻起作用了。 獲得業務角色的代碼是

final List<IAGBusinessRoleView> businessRoleList =
        new DefaultS4cBusinessRoleMetadataService()
            .getAllIAGBusinessRoleView()
            .select(
                IAGBusinessRoleView.BUS_ROLE_ID,
                IAGBusinessRoleView.USER_NAME,
                IAGBusinessRoleView.UUID,
                IAGBusinessRoleView.DESCRIPTION,
                IAGBusinessRoleView.TIME_STAMP,
                IAGBusinessRoleView.LANGUAGE_KEY)
            .orderBy(IAGBusinessRoleView.BUS_ROLE_ID, Order.ASC)
            .execute(configContext);
return businessRoleList;

它使用了相同的目的地。

在查看了問題之后,我們發現后台的S / 4HANA服務沒有按預期運行。

進一步的參考,我將描述一種了解OData VDM幕后發生情況的方法。


使HTTP調用可見

為了查看OData VDM執行的HTTP請求,我們將構建一個測試來設置和拆除將請求發送到的本地模擬服務器。 為此,我們使用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 )內創建一個普通的測試類。

將您在上一步中下載的元數據文件移動到測試后命名的子目錄中的test-resources目錄中。 因此,在我的示例中,我具有以下結構: 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雲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響應。 在左側,您可以看到最接近的模擬請求,而在右側,您可以看到實際收到的請求。

現在,您可以通過Postman或瀏覽器使用右側的請求,並直接驗證行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM