簡體   English   中英

如何從HTTP響應中獲取mongodb objectId

[英]How to get mongodb objectId from HTTP response

我正在測試一個將對象保存在數據庫中的端點。 Post方法按預期工作,對象轉到數據庫。 我試圖找出如何從我得到的HTTP響應中獲取mongo objectID,以便我可以使用Put和Delete方法進行進一步測試,因為我需要URI的objectId。

@Test
public void saveRule() throws URISyntaxException, IOException {

    RuleDTO ruleDTO = new RuleDTO();
    ruleDTO.setTitle("My rule");
    ruleDTO.setIndex(666);

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(ruleDTO);

    String target = "http://localhost:8090" + "/v2/rules"; // fix
    URI uri = new URI(target);
    HttpPost httpPost = new HttpPost(uri.toASCIIString());
    StringEntity entity = new StringEntity(json);
    httpPost.setHeader("Accept", "application/json");
    httpPost.setHeader("Content-type", "application/json");
    httpPost.setEntity(entity);
    HttpResponse response = httpClient.execute(httpPost);

    int HTTPcode = response.getStatusLine().getStatusCode();
    HttpEntity getEntity = response.getEntity();
    String getJson = EntityUtils.toString(getEntity);

    ObjectMapper objectMapper = new ObjectMapper();
    Rule rule = objectMapper.readValue(getJson, Rule.class);
    boolean isMyRule = false;

    if (rule.getTitle().equals("My rule")) {
        isMyRule = true;
    }

    boolean correctStatus = HTTPcode >= 200 && HTTPcode <= 300 ? true : false;

    assertTrue(correctStatus);
    assertTrue(isMyRule);
}

鑒於您說測試是針對端點,這個答案假設它是端到端測試而不是單元測試。 以下是您可以嘗試的一些事項:

  1. 通常,大多數REST API在發出POST請求以添加記錄時,都會返回已添加的記錄的密鑰。 如果您可以選擇更改服務,也許您應該考慮將此功能添加到您的服務中(如果它還沒有)。 然后,在測試中,只需要從對您發出的POST請求的響應中讀取密鑰,然后使用它來發出PUTDELETE請求。
  2. 如果方法(1)不是一個選項,並且如果您確定可以根據記錄的其他字段獲取剛剛添加的記錄,則可以在端點上進行GET請求。 然后,迭代獲取的記錄,直到獲得剛剛插入的記錄的密鑰(在您的情況下為ObjectId),並使用它來發出PUTDELETE請求。 很明顯,這會使測試運行得更慢,尤其是當記錄數量很高時。 如果有GET端點根據字段進行過濾,比如 - 例如使用查詢參數(例如: /v2/rules?title="My rule"&index="666" ),那么這應該大大加快測試執行速度,應該用於GET請求。
  3. 如果上述兩種方法由於任何原因都不可行,並且如果可以通過測試查詢MongoDB Collection,那么,可能唯一的選擇(我現在可以想到)是通過測試連接到MongoDB,然后查詢剛剛插入的文檔,獲取ObjectId,並使用它來生成PUTDELETE請求。 這可能是最不正統的方式,如果您在實際數據庫上運行測試,則不建議這樣做。 但是,如果您計划在模擬數據庫上運行它(我認為如果它是您正在編寫的端到端測試,我認為您不會這樣做),那么這仍然是一種方法。

暫無
暫無

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

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