[英]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幕后發生情況的方法。
為了查看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.