在Spring REST Controller中创建资源后,我将在标题中返回它的位置,如下所示.
@RequestMapping(..., method = RequestMethod.POST)
public ResponseEntity<Void> createResource(..., UriComponentsBuilder ucb) {
...
URI locationUri = ucb.path("/the/resources/")
.path(someId)
.build()
.toUri();
return ResponseEntity.created(locationUri).build();
}
在单元测试中,我正在检查其位置如下.
@Test
public void testCreateResource(...) {
...
MockHttpServletRequestBuilder request = post("...")
.content(...)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON);
request.session(sessionMocked);
mvc.perform(request)
.andExpect(status().isCreated())
.andExpect(header().string("Location", "/the/resources" + id);
}
此结果案例失败,并显示以下消息.
java.lang.AssertionError: Response header Location expected:</the/resources/123456> but was:<http://localhost/the/resources/123456>
好像我必须在期望中为Location头提供上下文前缀http:// localhost.
>硬编码上下文是否安全?如果是这样,为什么?
>如果没有,为测试用例正确生成它的正确方法是什么?
最佳答案:
如果你不需要在响应的Location头中有一个完整的URI(即没有要求,设计约束等……):考虑切换使用相对URI(从HTTP标准角度看是有效的 – 参见[1] ]:https://tools.ietf.org/html/rfc7231)相对URI是现代浏览器和库支持的建议标准.这将允许您测试端点的行为,并使其在长期运行中不那么脆弱.
如果您需要断言完整路径,因为您使用的是MockMvc,您可以将测试请求中的uri设置为您想要的:
@Autowired
private WebApplicationContext webApplicationContext;
@Test
public void testCreateResource() {
MockMvc mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
mvc.perform(MockMvcRequestBuilders.get(new URI("http://testserver/the/resources")));
这将使注入的构建器在调用构建时生成“http://testserver”.请注意,如果删除此测试行为,将来的框架更改可能会让您头疼.
标签:rest,spring,testng,mockmvc 来源: https://codeday.me/bug/20190516/1114589.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。