簡體   English   中英

java.lang.AssertionError:預期狀態:<400> 但為:<404>

[英]java.lang.AssertionError: Status expected:<400> but was:<404>

下面是我正在嘗試為其編寫單元測試的 controller 方法:

@GetMapping("/status/{uuid}")
    public ResponseEntity<StatusResponse> getStatusByUUID(@PathVariable(value = "uuid", required = true) String uuid) {
        if(uuid == null || uuid.isBlank() || uuid.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, Constant.UUID_VALIDATION_EXCEPTION);
        }
        logger.info("Get status request came in for UUID number: " + uuid);
        return Handler.getStatusByUUID(uuid);
    }

下面是我要運行的聯合測試

@Test
    public void testGetStatusWhenUUIDIsEmpty() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/status/{uuid}", "")
                .characterEncoding("utf-8")
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isBadRequest())
                .andExpect(result -> assertTrue(result.getResolvedException() instanceof ResponseStatusException));
                
    }

下面是錯誤的堆棧跟蹤

java.lang.AssertionError: Status expected:<400> but was:<404>
    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)

有人可以幫我解決我錯過的事情嗎? 感謝您的時間。

通過定義@GetMapping("/status/{uuid}") ,您已經定義了一個需要額外路徑的端點。 然而,在測試中,生成的 URL 是/status/ ,它與GetMapping的模式不匹配,因此是 404。

如果您修改 GetMapping 以在沒有附加路徑的情況下也處理 URI,它應該觸發該方法。

@GetMapping(value = {"/status", "/status/{uuid}"})
public ResponseEntity<StatusResponse> getStatusByUUID(@PathVariable(value = "uuid", required = false) String uuid) { ... }

這是我運行的測試代碼

@RestController
public class MyController {
  @GetMapping("/foo/{var}")
  public ResponseEntity<Void> foo(@PathVariable(value = "var") String var) {
    HttpStatus status = StringUtils.hasText(var) ? HttpStatus.OK : HttpStatus.BAD_REQUEST;
    return ResponseEntity.status(status).build();
  }

  @GetMapping(value = {"/bar", "/bar/{var}"})
  public ResponseEntity<Void> bar(@PathVariable(value = "var", required = false) String var) {
    HttpStatus status = StringUtils.hasText(var) ? HttpStatus.OK : HttpStatus.BAD_REQUEST;
    return ResponseEntity.status(status).build();
  }
}
public class MyTest {
  MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();

  @Test
  public void foo() {
    MvcResult result = mockMvc.perform(get("/foo/{var}", "")).andReturn();
    assertEquals(404, result.getResponse.getStatus());
  }

  @Test
  public void bar1() {
    MvcResult result = mockMvc.perform(get("/bar/{var}", "val")).andReturn();
    assertEquals(200, result.getResponse.getStatus());
  }

  @Test
  public void bar2() {
    MvcResult result = mockMvc.perform(get("/bar/{var}", "")).andReturn();
    assertEquals(400, result.getResponse.getStatus());
  }
}

暫無
暫無

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

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