Java 如何从HTTP响应获取mongodb对象ID

Java 如何从HTTP响应获取mongodb对象ID,java,spring,mongodb,http,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

我正在测试在数据库中保存对象的端点。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);
}
@测试
public void saveRule()引发URI语法异常,IOException{
RuleDTO RuleDTO=新的RuleDTO();
规则至setTitle(“我的规则”);
规则至setIndex(666);
ObjectMapper mapper=新的ObjectMapper();
字符串json=mapper.writeValueAsString(ruleDTO);
字符串目标=”http://localhost:8090“+”/v2/规则“//修复
URI=新URI(目标);
HttpPost-HttpPost=newhttppost(uri.toascistring());
StringEntity=新的StringEntity(json);
setHeader(“接受”、“应用程序/json”);
setHeader(“内容类型”、“应用程序/json”);
httpPost.setEntity(实体);
HttpResponse response=httpClient.execute(httpPost);
int HTTPcode=response.getStatusLine().getStatusCode();
HttpEntity getEntity=response.getEntity();
字符串getJson=EntityUtils.toString(getEntity);
ObjectMapper ObjectMapper=新的ObjectMapper();
Rule Rule=objectMapper.readValue(getJson,Rule.class);
布尔isMyRule=false;
if(rule.getTitle().equals(“我的规则”)){
isMyRule=true;
}

boolean correctStatus=HTTPcode>=200&&HTTPcode如果您说测试是针对端点的,那么这个答案是假设它是端到端测试而不是单元测试。下面是一些您可以尝试的事情:

  • 通常,大多数RESTAPI在发出添加记录的
    POST
    请求时,都会返回已添加记录的键。 如果你有选择改变服务,也许你应该考虑如果你的服务还没有的话,就把这个功能添加到你的服务中。 然后,在测试中,只需从您发出的
    POST
    请求的响应中读取密钥,然后使用它发出
    PUT
    DELETE
    请求
  • 如果方法(1)不是一个选项,并且如果您确信可以根据记录的其他字段获取刚才添加的记录,则可以在端点上发出
    GET
    请求。然后,对获取的记录进行迭代,直到获得密钥(本例中为ObjectId),并使用它发出
    PUT
    DELETE
    请求。很明显,这会使测试运行得更慢,尤其是在记录数较多的情况下。如果有
    GET
    端点根据字段进行筛选,例如使用查询参数(例如:
    /v2/rules?title)=“我的规则”&index=“666”
    ),那么这将大大加快测试执行速度,并应用于
    GET
    请求
  • 如果上述两种方法由于任何原因都不可行,并且如果可以通过测试查询MongoDB集合,那么,可能是留给您的唯一选项(我现在可以想到)是通过测试连接到MongoDB,然后查询您刚刚插入的文档,获取ObjectId,并使用它发出
    PUT
    amd
    DELETE
    请求。这可能是最不常规的方法,如果您在实际数据库上运行测试,则不建议这样做。但是,如果您计划g在模拟数据库上运行它(如果您正在编写端到端测试,我认为您不会这样做),那么这仍然是一条路要走