CompletableFuture <responseentity>状态码期望

时间:2018-08-16 12:58:36

标签: spring spring-mvc completable-future spring-cloud-contract

因此,我创建了一个Controller,其中有一个POST端点,如下所示:

@PostMapping("/foo/{some-field}")
public CompletableFuture<ResponseEntity> foo() {
    //Do some operations...
    ...
    if(doesNotExist({some-field})) {
        return CompletableFuture.completedFuture(ResponseEntity.notFound().build());
    }
    return CompletableFuture.completedFuture(ResponseEntity.ok().build());
}

现在,我希望如果是doesNotExist({some-field}) == true,系统将以NOT_FOUND的状态提示我。 但是,我每次都以OK状态结束。

关于返回ResponseEntity的方式,我的期望是否错误? 如果有NOT_FOUND,如何获得doesNotExist({some-field}) == true状态的任何建议,将不胜感激。

编辑/更新

从这些评论中,我认为我的第一个问题有点难理解,所以让我解释一下何时,这似乎是失败的,因为看来我对ResponseEntity.HttpStatus的假设是是正确的。

我对上面的代码块做了一些小的调整。 我收到意外状态的情况是尝试通过Spring Cloud Contracts测试NOT_FOUND情况。

合同示例如下:

Contract.make {
  request {
    method 'POST'
    url "/foo/SomeNoneExistingField"
    body("{}")
    headers {
      contentType applicationJson()
    }
  }
  response {
    status HttpStatus.NOT_FOUND.value()
  }
}

因此,此合同中的{some-field}设置为确保doesNotExist({some-field}) == true的字段。如果同时调试我的代码,我会看到它最终出现在此块中。 尽管如此,Spring Cloud Contract的测试状态为response.status == OK NOT_FOUND

如果我对从HttpStatus返回的CompletableFuture的假设是正确的,我可能会错误地使用Spring Cloud Contracts? (再次)非常感谢任何帮助/建议。

2 个答案:

答案 0 :(得分:0)

这里没有什么复杂的,它应该可以按预期工作。

发生这种情况的原因可能是因为var response = SubmitRequest<SomeAppropriateType>(...); // pass in your parameter values 不正确,所以每次都将其阻塞。

确保{some-state}评估返回{some-state},并且编译器进入true块。

if

答案 1 :(得分:0)

好的,我发现了我遇到的问题。 感谢@Marcin Grzejszczak使我在配置方面处于正确的轨道。

合同中缺少像CompletableFuture这样的异步结果处理能力,我需要在结果中添加async()

因此,这样的合同:

Contract.make {
  request {
    method 'POST'
    url "/foo/SomeNoneExistingField"
    body("{}")
    headers {
      contentType applicationJson()
    }
  }
  response {
    status HttpStatus.NOT_FOUND.value()
    async() // <---- This was it!
  }
}

搞定了。