【问题标题】:Spring controller test path variable gives 404Spring控制器测试路径变量给出404
【发布时间】:2021-02-08 06:41:23
【问题描述】:

我知道这里有人问过这个问题,但我找不到答案。我有一个接受路径变量的 Spring REST 控制器端点,但我一直得到 404 而不是 200。

这是我的控制器方法:

@GetMapping("/colorNames/{colorFamily}")
public ResponseEntity<List<ColorNameFamilyDTO>> getColorNamesByColorFamily(@PathVariable String colorFamily)
{
    List<ColorNameFamilyDTO> colorInformations = service.getColorNamesByColorFamily(colorFamily.toUpperCase());
    
    return ResponseEntity.ok(colorInformations);
}

我的测试是:

@RunWith(SpringRunner.class)
@WebMvcTest(InfoController.class)
public class InfoControllerTest {
 @Autowired
 private MockMvc mockMvc;

 @MockBean
 private InfoService service;

 @Autowired
 private ObjectMapper objectMapper;

@Test
public void testGetColorNamesByFamily() throws Exception
{
    List<ColorNameFamilyDTO> colorInformations = new ArrayList<>();
    Mockito.when(service.getColorNamesByColorFamily(Mockito.anyString()))
    .thenReturn(colorInformations);
    mockMvc.perform(get("/colorNames/{colorFamily}", "Blue")
            .contentType("text/plain")).andExpect(status().isOk());
}
}

我试过使用param 并直接在路径中指定字符串。怎么了?我正在使用 SpringBoot 2.1.3.RELEASE。

添加doPrint() 会在控制台上显示:

 MockHttpServletRequest:
  HTTP Method = GET
  Request URI = /colorNames/Blue
   Parameters = {}
      Headers = [Content-Type:"text/plain"]
         Body = <no character encoding set>
  Session Attrs = {}

Handler:
         Type = com.controller.Controller
       Method = public org.springframework.http.ResponseEntity<java.util.List<com.dto.ColorNameFamilyDTO>> com.controller.getColorNamesByColorFamily(java.lang.String)

 Async:
 Async started = false
 Async result = null

Resolved Exception:
         Type = null

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

FlashMap:
   Attributes = null

MockHttpServletResponse:
       Status = 404
Error message = null
      Headers = []
 Content type = null
         Body = 
Forwarded URL = null
Redirected URL = null
      Cookies = []

【问题讨论】:

    标签: java spring junit mockmvc


    【解决方案1】:

    如果 "/colorNames" 没有端点,您将获得 HTTP 404。因此,请检查您的控制器。您的控制器类应使用 @RestController 注释进行标记。

    【讨论】:

    • 控制器标记有该注释。
    【解决方案2】:

    你可以尝试使用RequestBuilder对象来调用控制器

     requestBuilder = MockMvcRequestBuilders.get("/colorNames/{colorFamily}", "Blue")
                        .contentType(MediaType.TEXT_PLAIN_VALUE)
                        .accept(MediaType.APPLICATION_JSON_UTF8);
    
      mockMvc.perform(requestBuilder)
                        .andExpect(status().isOk())
                        .andDo(print())
                        .andReturn();
    

    print() 会告诉你你正在调用哪个 api 路径

    更新:

    请检查控制器和测试类

    @RestController
    public class AddDataController {
    
        @Autowired
        public AddDataService addDataService;
    
        @GetMapping(value = "colourNames/{pathVar}")
        public ResponseEntity dataAdded(@PathVariable String pathVar){
            return addDataService.printPathVariable(pathVar);
        }
    }
    

    测试类应该是

    @WebMvcTest(AddDataController.class)
    @RunWith(SpringRunner.class)
    class AddDataControllerTest {
    
        @MockBean
        public AddDataService addDataService;
    
        @Autowired
        public MockMvc mockMvc;
    
        @BeforeEach
        public void setUp(){
            MockitoAnnotations.initMocks(this);
        }
    
        @Test
        void dataAdded() throws Exception {
    
            RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/colourNames/{pathVar}", "Blue")
                    .contentType(MediaType.TEXT_PLAIN_VALUE);
    
            mockMvc.perform(requestBuilder)
                    .andExpect(status().isOk())
                    .andDo(print())
                    .andReturn();
    
        }
    }
    

    你能在这里分享 print() 响应吗

    【讨论】:

    • 请求 URI 是 /colorNames/Blue
    • 请求是 Request URI = /colorNames/Blue 但响应是 404
    • 你能在这里分享 print() 响应吗
    • 使用控制台响应更新了问题。我不确定print 是否会产生特定的输出。
    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2017-05-23
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多