簡體   English   中英

預期狀態:<200> 但為:<400> MockMvc 錯誤

[英]Status expected:<200> but was:<400> error with MockMvc

我在測試過去幾個小時試圖解決的 Spring Boot 控制器時遇到問題。 我對編碼很陌生,但我還是在我的公司得到了那個任務。

我的控制器:

@GetMapping(value = "/data", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Object> getData(@RequestParam("core") List<String> core, @RequestParam("date") List<String> date,
        @RequestParam("state") String state, @RequestParam("area") List<String> area,
        @RequestParam("type") List<String> type, @RequestParam("analyt") String analyt,
        @RequestParam("wp") String wp, @RequestParam("subDesc") String subDesc,
        @RequestParam("anaMonitor") List<String> anaMonitor, @RequestParam("ecoMonitor") List<String> ecoMonitor,
        @RequestParam("subType") List<String> subType, @RequestParam("needed") List<String> needed,
        @RequestParam("notify") List<String> notify, @RequestParam("available") List<String> available,
        @RequestParam("phase") List<String> phase, @RequestParam("subAvailable") List<String> subAvailable,
        @RequestParam("subShipped") List<String> subShipped, @RequestParam("external") List<String> external,
        @RequestParam("valid") List<String> valid, @RequestParam("contract") List<String> contract) {
    FilterInputModel model = new FilterInputModel(core, date, state, type, area, analyt, wp, subDesc, anaMonitor, ecoMonitor, subType, needed, notify, available, phase, subAvailable, subShipped, external, valid, contract);  
        return new ResponseEntity<>(vaultService.getFilteredFields(model), HttpStatus.OK);
    }

這是一個測試:

@DisplayName("Controller Test")
@AutoConfigureMockMvc
@WebMvcTest(controllers = Controller.class, excludeAutoConfiguration = SecurityAutoConfiguration.class)
class ControllerTest {

    @Autowired
    private MockMvc mockMvc;
    
    private FilterInputModel model;
    
    @MockBean
    private TestService testService;
    
    @Autowired
    ControllerTest() {
    }

    @BeforeEach
    void setup() {
        MockitoAnnotations.openMocks(this);
        
    @Test
    void getDataTest() throws Exception {
        List<Object> response = new ArrayList<>();
        when(vaultService.getFilteredFields(model))
            .thenReturn(response)
            .thenReturn(HttpStatus.OK);
            
        this.mockMvc.perform(
                MockMvcRequestBuilders.get("/api/data")
                    .contentType(MediaType.APPLICATION_JSON_VALUE)
                    .accept("application/json"))
                .andExpect(MockMvcResultMatchers.status().isOk());
                .andExpect(result -> assertEquals(response, result.getAsyncResult()));
   }

這是我得到的答案。 它在一條錯誤消息中說“方法參數類型列表的必需請求參數'核心'不存在”,但該答案對我沒有多大幫助。 我仍然堅持尋找答案。

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /api/data
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Accept:"application/json"]
             Body = null
    Session Attrs = {}

Handler:
             Type = hr.ogcs.ltt.api.lttapi.controller.LttController
           Method = hr.ogcs.ltt.api.lttapi.controller.LttController#getData(List, List, String, List, List, String, String, String, List, List, List, List, List, List, List, List, List, List, List, List)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.bind.MissingServletRequestParameterException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 400
    Error message = Required request parameter 'core' for method parameter type List is not present
          Headers = [Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers"]
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

Status expected:<200> but was:<400>
Expected :200
Actual   :400
<Click to see difference>

java.lang.AssertionError: Status expected:<200> but was:<400>
    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59)
    at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122)
    at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:627)
    at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:212)
   at hr.ogcs.ltt.api.apicontroller.ControllerTest.getDataTest(ControllerTest.java:126) <31 internal lines>
   at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)<9 internal lines>
   at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)<48 internal lines>

您沒有向該方法發送所需的參數(使用@RequestParam注釋的參數)。 默認情況下,它們都是必需的。 如果不存在 Spring 會阻止缺少參數的請求。

發送參數示例:

mvc.perform(
    MockMvcRequestBuilders.get("/public/xpto/{code}", "21212").param("core", "ubababacaio")
        .contentType(MediaType.APPLICATION_JSON)
        .contentType(MediaType.APPLICATION_JSON_VALUE).characterEncoding("UTF-8")).andExpect(status().isOk());

您可以將所有這些參數放在 MultiValueMap 中,並一次性傳遞它們!

MultiValueMap<String, String> allParams = new LinkedMultiValueMap<>(){{
    put(<KEY>, <VAL>)
    ...
}}

MockMvcRequestBuilders.get("/api/ecotox").params(allParams).contentType(MediaType.APPLICATION_JSON_VALUE).accept("application/json"))
.andExpect(MockMvcResultMatchers.status().isOk())

.andExpect(result -> assertEquals(response, result.getAsyncResult())); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM