首页 > 解决方案 > 如何模拟 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);
    }

谢谢你。

标签: spring-bootunit-testingjunitmockito

解决方案


它不?喜欢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 层的依赖,并且该服务更容易在其他代码中重用。


推荐阅读