我正在测试将对象保存在数据库中的端点。 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);
}
答案 0 :(得分:2)
鉴于您说测试是针对端点的,因此此答案假设它是端对端测试而不是单元测试。您可以尝试以下操作:
POST
请求以添加记录时,都会返回添加的记录的键。
如果您可以选择更改服务,则可能需要考虑将该功能添加到您的服务中(如果尚未添加)。
然后,在测试中,只需从响应中读取对您提出的POST
请求的密钥,然后使用它来发出PUT
和DELETE
请求即可。 / li>
GET
请求端点。然后,对获取的记录进行迭代,直到获得刚插入的记录的键(在您的情况下为ObjectId),然后使用它发出PUT
和DELETE
请求。显然,这将使测试运行慢得多,尤其是在记录数很多时。如果有GET
个端点根据字段进行过滤,例如-使用查询参数(例如:/v2/rules?title="My rule"&index="666"
),则这将大大加快测试的执行速度,并应用于{{1 }}请求。 GET
和PUT
请求。这可能是最不合常规的方法,如果在实际数据库上运行测试,则不建议这样做。但是,如果您打算在模拟数据库上运行它(如果您正在编写的是端到端测试,我不认为您会这样做),那仍然是一种方法。