如何从HTTP响应中获取mongodb objectId

时间:2018-09-05 12:14:43

标签: java spring mongodb http

我正在测试将对象保存在数据库中的端点。 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 个答案:

答案 0 :(得分:2)

鉴于您说测试是针对端点的,因此此答案假设它是端对端测试而不是单元测试。您可以尝试以下操作:

  1. 通常,大多数REST API在发出POST请求以添加记录时,都会返回添加的记录的键。 如果您可以选择更改服务,则可能需要考虑将该功能添加到您的服务中(如果尚未添加)。 然后,在测试中,只需从响应中读取对您提出的POST请求的密钥,然后使用它来发出PUTDELETE请求即可。 / li>
  2. 如果方法(1)不是一个选项,并且如果您确定可以根据记录的其他字段来获取刚刚添加的记录,则可以在该记录上发出GET请求端点。然后,对获取的记录进行迭代,直到获得刚插入的记录的键(在您的情况下为ObjectId),然后使用它发出PUTDELETE请求。显然,这将使测试运行慢得多,尤其是在记录数很多时。如果有GET个端点根据字段进行过滤,例如-使用查询参数(例如:/v2/rules?title="My rule"&index="666"),则这将大大加快测试的执行速度,并应用于{{1 }}请求。
  3. 如果以上两种方法由于某种原因都不可行,并且可以通过测试查询MongoDB集合,那么可能剩下的唯一选择(我现在可以想到)是通过以下方式连接到MongoDB测试,然后查询您刚刚插入的文档,获取ObjectId,并使用它发出GETPUT请求。这可能是最不合常规的方法,如果在实际数据库上运行测试,则不建议这样做。但是,如果您打算在模拟数据库上运行它(如果您正在编写的是端到端测试,我不认为您会这样做),那仍然是一种方法。