spring-boot - 如何模拟 ResponseEntity方法
问题描述
我正在 Spring Boot 中实现单元测试,但我无法让它们工作。
这是我在 RouletController 类中的方法。
@PutMapping("/open_roulette/")
public ResponseEntity<?> enableRoluette(@RequestParam("id") Long id) {
return rouletteService.enableRouletteById(id);
}
这是我在 RouletteService 类上的方法。
@Override
public ResponseEntity<?> enableRouletteById(Long roulette_id) {
Optional<Roulette> roulette = rouletteRepository.findById(roulette_id);
HashMap<String, Object> response = new HashMap<String, Object>();
if (roulette.isPresent()) {
Roulette request = roulette.get();
{
if (!request.isRouletteStatus())
request.setBets(null);
}
request.setRouletteStatus(true);
rouletteRepository.save(request);
response.put("message", "La ruleta ha sido activada con éxito");
response.put("roulette", request);
return new ResponseEntity<Map<String, Object>>(response, HttpStatus.CREATED);
} else {
response.put("message", "La apuesta no es correcta");
response.put("error", HttpStatus.BAD_REQUEST);
return new ResponseEntity<Map<String, Object>>(response, HttpStatus.BAD_REQUEST);
}
}
这是我的测试方法 RouletControllerTest 类,我正在尝试做这样的事情,但我得到“方法 thenReturn 不适用于参数等。
@Test
public void testEnableRoluette() {
HashMap<String, Object> response = new HashMap<String, Object>();
ResponseEntity<?> responseEntity = new ResponseEntity<Map<String, Object>>(response, HttpStatus.CREATED);
Mockito.when(rouletteService.enableRouletteById(14L)).thenReturn(responseEntity);
assertEquals(rouletteController.enableRoluette(14L), responseEntity);
}
谢谢你。
解决方案
它不?
喜欢ResponseEntity
. 如果你给出真实的类型,它就会起作用,即。响应实体>。
错误消息暗示了这一点。它正在期待CAP#2
,但正在得到CAP#1
:
ControllerTest.java:26: error: no suitable method found for thenReturn(ResponseEntity<CAP#1>)
.thenReturn (responseEntity);
^
method OngoingStubbing.thenReturn(ResponseEntity<CAP#2>) is not applicable
(argument mismatch; ResponseEntity<CAP#1> cannot be converted to ResponseEntity<CAP#2>)
method OngoingStubbing.thenReturn(ResponseEntity<CAP#2>,ResponseEntity<CAP#2>...) is not applicable
(argument mismatch; ResponseEntity<CAP#1> cannot be converted to ResponseEntity<CAP#2>)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ?
CAP#2 extends Object from capture of ?
您还可以通过将响应处理移至控制器来改进您的代码。您的服务应该只返回Map<>
. 这消除了对 web 层的依赖,并且该服务更容易在其他代码中重用。
推荐阅读
- python - Django:单击按钮后调用方法
- python - PyOpenGL 如何选择颜色来绘制每个形状?
- java - Gson 自定义反序列化器从另一个字段派生一个字段的类型
- angular - 如何在 Protractor 中配置后端 URL(前端项目)
- algorithm - 如何从元组中删除第 n 个元素?
- azure - 可以使用 LinqPad 更新 Azure Web 应用程序设置吗?
- python - 具有随机大小元素的随机大小的随机矩阵总计最大大小
- azure - Azure 数据目录 Gen2 是免费的吗?
- c++ - 如何访问 RTCVideoRenderer 的帧?(IOS)
- javascript - 如何在 JS 中以 YYYY-MM-DD 格式获取第二天的日期?