有两种类似的端点,让我们假设:POST devices/{uuid}/{imei}
和POST devices/{uuid}/device-info
。第一个是更新 UUID 指定的设备的 IMEI(通过路径变量传递),第二个是更新其其他参数(通过请求作为 json 主体传递)。
当服务器从 jar 文件“正常”工作时,两个端点都按照上面描述的方式正常工作,这是由 Postman 测试的。但是当我运行集成测试(使用 maven 或直接通过 IntelliJ)时,将 POST 请求发送到devices/{uuid}/device-info
服务器端解释为对 的请求devices/{uuid}/{imei}
,其中短语“设备信息”被视为 IMEI 号码。
对于集成测试,我使用自动配置的MockMvc
类和 SpringBootTest + Mockito + JUnit4 实用程序。webEnvironment
设置为SpringBootTest.WebEnvironment.MOCK
,一切都用SpringRunner
.
我正在寻找解决方案,但实际上一无所获。有没有人遇到过类似的事情?
编辑:如果有帮助,我将添加 API 声明。
@ResponseStatus(value = HttpStatus.NO_CONTENT, reason = "Device info successfully updated")
@PutMapping(value = "/devices/{deviceUuid}/device-info", consumes = {"application/json"})
ResponseEntity<Void> updateDeviceInfo(@Valid @RequestBody DeviceInfo deviceInfo);
@ResponseStatus(value = HttpStatus.NO_CONTENT, reason = "Device IMEI successfully updated")
@PutMapping(value = "/devices/{deviceUuid}/{imei}")
ResponseEntity<Void> updateDeviceImei(@PathVariable("deviceUuid") UUID deviceUuid, @PathVariable("imei") String imei);
测试本身非常简单:
DeviceInfo deviceInfo = this.prepareDeviceInfo();
String url = String.format("/v3/devices/%s/device-info", super.firstDeviceUuid);
mvc.perform(put(url)
.content(asJsonString(deviceInfo)))
.andExpect(status().is(204));
asJsonString
使用 Jackson 方法从对象准备 JSON 的简单辅助方法在哪里。
我终于找到了答案。当我刚刚devices/{uuid}/{imei}
在控制器中评论端点处理程序时,测试的结果状态是 415,所以看起来在控制器中没有找到处理程序。然后我找到了这个解决方案:Spring MVC 测试导致 415 错误,这对我来说非常有效。
我只是在我的测试用例中将内容类型设置为MediaType.APPLICATION_JSON_UTF8如下,并且由于它在服务器端正确解释。
mvc.perform(put(url)
.content(mapper.writeValueAsString(deviceInfo))
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(status().is(204));
编辑:MediaType.APPLICATION_JSON也很好用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句