【问题标题】:How to Mock a ResponseEntity<?> method如何模拟 ResponseEntity<?> 方法
【发布时间】:2020-05-23 06:27:46
【问题描述】:

我正在 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-boot unit-testing junit mockito


    【解决方案1】:

    它不喜欢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&lt;&gt;。这消除了对 web 层的依赖,服务更容易在其他代码中重用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-19
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      相关资源
      最近更新 更多